New issue
Advanced search Search tips

Issue 908431 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner:
Closed: Nov 28
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Mac
Pri: 2
Type: Bug



Sign in to add a comment

FATAL:os_crypt_mac.mm(145)] Check failed: !raw_key.empty().

Project Member Reported by asvitk...@chromium.org, Nov 26

Issue description

Chrome Version: ToT f16a2137fd554484d9c3f8e44ec143b90c71e8d5
OS: Mac 10.13

What steps will reproduce the problem?
(1) Build local Chromium and launch it.
(2) Click "Deny" in dialog box "Chromium wants to use your confidential information stored in "Chromium Safe Storage" in your keychain.

What is the expected result?

No DCHECK should fire.

What happens instead?

DCHECKs fire - lots with the following stack trace:

[59323:18947:1126/094044.526706:FATAL:os_crypt_mac.mm(145)] Check failed: !raw_key.empty(). 
0   libbase.dylib                       0x00000001116edd83 base::debug::StackTrace::StackTrace(unsigned long) + 83
1   libbase.dylib                       0x00000001116ede3d base::debug::StackTrace::StackTrace(unsigned long) + 29
2   libbase.dylib                       0x00000001113dcfaa base::debug::StackTrace::StackTrace() + 26
3   libbase.dylib                       0x000000011142481e logging::LogMessage::~LogMessage() + 142
4   libbase.dylib                       0x0000000111423615 logging::LogMessage::~LogMessage() + 21
5   libos_crypt.dylib                   0x00000001696ec7e0 OSCrypt::SetRawEncryptionKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 224
6   libnetwork_service.dylib            0x000000015ffd71b9 network::NetworkService::SetEncryptionKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 25
7   libnetwork_service.dylib            0x00000001602efb59 network::mojom::NetworkServiceStubDispatch::Accept(network::mojom::NetworkService*, mojo::Message*) + 12265
8   libnetwork_service.dylib            0x000000015ffdb9e3 network::mojom::NetworkServiceStub<mojo::RawPtrImplRefTraits<network::mojom::NetworkService> >::Accept(mojo::Message*) + 83
9   libbindings.dylib                   0x00000001123c518a mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message*) + 1530
10  libbindings.dylib                   0x00000001123c4b81 mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(mojo::Message*) + 33
11  libbindings.dylib                   0x00000001123c317c mojo::FilterChain::Accept(mojo::Message*) + 412
12  libbindings.dylib                   0x00000001123c7896 mojo::InterfaceEndpointClient::HandleIncomingMessage(mojo::Message*) + 230
13  libbindings.dylib                   0x00000001123d86fc mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper*, mojo::internal::MultiplexRouter::ClientCallBehavior, base::SequencedTaskRunner*) + 1564
14  libbindings.dylib                   0x00000001123d7cbf mojo::internal::MultiplexRouter::Accept(mojo::Message*) + 639
15  libbindings.dylib                   0x00000001123c317c mojo::FilterChain::Accept(mojo::Message*) + 412
16  libbindings.dylib                   0x00000001123aded0 mojo::Connector::ReadSingleMessage(unsigned int*) + 1120
17  libbindings.dylib                   0x00000001123af191 mojo::Connector::ReadAllAvailableMessages() + 129
18  libbindings.dylib                   0x00000001123aeef6 mojo::Connector::OnHandleReadyInternal(unsigned int) + 262
19  libbindings.dylib                   0x00000001123aeddb mojo::Connector::OnWatcherHandleReady(unsigned int) + 27
20  libbindings.dylib                   0x00000001123b3864 void base::internal::FunctorTraits<void (mojo::Connector::*)(unsigned int), void>::Invoke<void (mojo::Connector::*)(unsigned int), mojo::Connector*, unsigned int>(void (mojo::Connector::*)(unsigned int), mojo::Connector*&&, unsigned int&&) + 148
21  libbindings.dylib                   0x00000001123b3756 void base::internal::InvokeHelper<false, void>::MakeItSo<void (mojo::Connector::* const&)(unsigned int), mojo::Connector*, unsigned int>(void (mojo::Connector::* const&&&)(unsigned int), mojo::Connector*&&, unsigned int&&) + 102
22  libbindings.dylib                   0x00000001123b36c5 void base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int), base::internal::UnretainedWrapper<mojo::Connector> >, void (unsigned int)>::RunImpl<void (mojo::Connector::* const&)(unsigned int), std::__1::tuple<base::internal::UnretainedWrapper<mojo::Connector> > const&, 0ul>(void (mojo::Connector::* const&&&)(unsigned int), std::__1::tuple<base::internal::UnretainedWrapper<mojo::Connector> > const&&&, std::__1::integer_sequence<unsigned long, 0ul>, unsigned int&&) + 101
23  libbindings.dylib                   0x00000001123b35c9 base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int), base::internal::UnretainedWrapper<mojo::Connector> >, void (unsigned int)>::Run(base::internal::BindStateBase*, unsigned int) + 89
24  libbindings.dylib                   0x00000001123a7b5b base::RepeatingCallback<void (unsigned int)>::Run(unsigned int) const & + 91
25  libbindings.dylib                   0x00000001123b1ddf mojo::SimpleWatcher::DiscardReadyState(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&) + 31
26  libbindings.dylib                   0x00000001123b215c void base::internal::FunctorTraits<void (*)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), void>::Invoke<void (* const&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&>(void (* const&&&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> const&&&, unsigned int&&, mojo::HandleSignalsState const&&&) + 92
27  libbindings.dylib                   0x00000001123b20ac void base::internal::InvokeHelper<false, void>::MakeItSo<void (* const&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&>(void (* const&&&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> const&&&, unsigned int&&, mojo::HandleSignalsState const&&&) + 92
28  libbindings.dylib                   0x00000001123b202c void base::internal::Invoker<base::internal::BindState<void (*)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> >, void (unsigned int, mojo::HandleSignalsState const&)>::RunImpl<void (* const&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), std::__1::tuple<base::RepeatingCallback<void (unsigned int)> > const&, 0ul>(void (* const&&&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), std::__1::tuple<base::RepeatingCallback<void (unsigned int)> > const&&&, std::__1::integer_sequence<unsigned long, 0ul>, unsigned int&&, mojo::HandleSignalsState const&) + 108
29  libbindings.dylib                   0x00000001123b1efb base::internal::Invoker<base::internal::BindState<void (*)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> >, void (unsigned int, mojo::HandleSignalsState const&)>::Run(base::internal::BindStateBase*, unsigned int, mojo::HandleSignalsState const&) + 107
30  libmojo_public_system_cpp.dylib     0x0000000112638117 base::RepeatingCallback<void (unsigned int, mojo::HandleSignalsState const&)>::Run(unsigned int, mojo::HandleSignalsState const&) const + 119
31  libmojo_public_system_cpp.dylib     0x0000000112637e6f mojo::SimpleWatcher::OnHandleReady(int, unsigned int, mojo::HandleSignalsState const&) + 447
32  libmojo_public_system_cpp.dylib     0x000000011263833d mojo::SimpleWatcher::Context::Notify(unsigned int, MojoHandleSignalsState, unsigned int) + 333
33  libmojo_public_system_cpp.dylib     0x000000011263654d mojo::SimpleWatcher::Context::CallNotify(MojoTrapEvent const*) + 77
34  libmojo_core_embedder_internal.dylib 0x00000001aa0675d8 mojo::core::WatcherDispatcher::InvokeWatchCallback(unsigned long, unsigned int, mojo::core::HandleSignalsState const&, unsigned int) + 216
35  libmojo_core_embedder_internal.dylib 0x00000001aa0669ac mojo::core::Watch::InvokeCallback(unsigned int, mojo::core::HandleSignalsState const&, unsigned int) + 156
36  libmojo_core_embedder_internal.dylib 0x00000001aa058d25 mojo::core::RequestContext::~RequestContext() + 597
37  libmojo_core_embedder_internal.dylib 0x00000001aa059145 mojo::core::RequestContext::~RequestContext() + 21
38  libmojo_core_embedder_internal.dylib 0x00000001aa02c31c mojo::core::NodeChannel::OnChannelMessage(void const*, unsigned long, std::__1::vector<mojo::PlatformHandle, std::__1::allocator<mojo::PlatformHandle> >) + 5020
39  libmojo_core_embedder_internal.dylib 0x00000001a9ff2223 mojo::core::Channel::OnReadComplete(unsigned long, unsigned long*) + 2035
40  libmojo_core_embedder_internal.dylib 0x00000001aa07c6fe mojo::core::(anonymous namespace)::ChannelPosix::OnFileCanReadWithoutBlocking(int) + 1262
41  libbase.dylib                       0x000000011173837e base::MessagePumpLibevent::FdWatchController::OnFileCanReadWithoutBlocking(int, base::MessagePumpLibevent*) + 62
42  libbase.dylib                       0x000000011173973d base::MessagePumpLibevent::OnLibeventNotification(int, short, void*) + 685
43  libbase.dylib                       0x000000011173cf3d event_process_active + 365
44  libbase.dylib                       0x000000011173c4a4 event_base_loop + 468
45  libbase.dylib                       0x00000001117399ba base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) + 490
46  libbase.dylib                       0x0000000111467b70 base::MessageLoopImpl::Run(bool) + 512
47  libbase.dylib                       0x0000000111516ccd base::RunLoop::Run() + 525
48  libbase.dylib                       0x000000011163e2c9 base::Thread::Run(base::RunLoop*) + 393
49  libbase.dylib                       0x000000011163ea43 base::Thread::ThreadMain() + 1107
50  libbase.dylib                       0x00000001117142b0 base::(anonymous namespace)::ThreadFunc(void*) + 192
51  libsystem_pthread.dylib             0x00007fff5ff6c661 _pthread_body + 340
52  libsystem_pthread.dylib             0x00007fff5ff6c50d _pthread_body + 0
53  libsystem_pthread.dylib             0x00007fff5ff6bbf9 thread_start + 13

Assigning to first person in components/os_crypt/OWNERS.

Per our coding guide:
A DCHECK() means “this condition must always be true”, not “this condition is normally true, but perhaps not in exceptional cases.”

https://chromium.googlesource.com/chromium/src/+/master/styleguide/c++/c++.md

 
Cc: vasi...@chromium.org
asvitkine@
Can you go to your Keychain, look for an entry called Chrome Safe Storage and let us know if the entry is empty or a random string?
I denied access in the dialog. So I assume it's empty because it couldn't get it from the entry.
The password in keychain for that is not an empty string.
Thanks, That explains it

When the network process gets the raw key, it is explicitly allowed to be empty (in case of a failed lookup). It therefore should not expect it to not be empty on the other side. Fix coming up
Cc: -thestig@google.com thestig@chromium.org
Status: Assigned (was: Untriaged)
Project Member

Comment 6 by bugdroid1@chromium.org, Nov 27

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/e5336934f6b0cf4523ff2e7ac21163dd6be852a5

commit e5336934f6b0cf4523ff2e7ac21163dd6be852a5
Author: Christos Froussios <cfroussios@chromium.org>
Date: Tue Nov 27 19:28:25 2018

[OSCrypt] Remove DCHECK on key not being empty on mac

Subprocesses set their encryption key by getting it from the browser with
GetRawEncryptionKey and setting it locally with SetRawEncryptionKey

Since GetRawEncryptionKey may return an empty string (e.g. because the
lookup into Keychain failed), SetRawEncryptionKey should not expect that
the key is never empty.

Bug:  908431 
Change-Id: Id9eece1bdf4492778c18178efc97380b800f5034
Reviewed-on: https://chromium-review.googlesource.com/c/1350915
Commit-Queue: Christos Froussios <cfroussios@chromium.org>
Reviewed-by: Chris Mumford <cmumford@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611249}
[modify] https://crrev.com/e5336934f6b0cf4523ff2e7ac21163dd6be852a5/components/os_crypt/os_crypt_mac.mm

Status: Fixed (was: Assigned)

Sign in to add a comment