-
Notifications
You must be signed in to change notification settings - Fork 3
chore: ensure downloaded slim binary version matches server #211
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: ethan/slim-over-dylib
Are you sure you want to change the base?
chore: ensure downloaded slim binary version matches server #211
Conversation
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
Not directly related but @jdomeracki-coder should we also implement binary verification in Coderd Desktop? cc: @deansheather |
929c831
to
262c4d1
Compare
|
||
let version: String | ||
do { | ||
let versionOutput = try await Subprocess.data(for: [binaryPath.path, "version", "--output=json"]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any way to drop privileges for this subprocess? We are root after all...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is possible with a combination of launchctl asuser <uid>
and sudo -u [<uid>|<username>]
:
sudo -u '#501' launchctl asuser 501 /usr/bin/whoami
One switches the UID, the other the (macOS specific) execution context.
Unfortunately,
$ sudo -u nobody launchctl asuser -2 /usr/bin/whoami
Could not switch to audit session 0x187c3: 1: Operation not permitted
does not work, and so we'd need to determine the currently logged in user in some other way.
501
is the first created user on the machine, and on corporate devices this will likely be some admin user.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's fine to execute it as root if it's too difficult, the signature is still ours so the risk is small
e9e15db
to
c7602c2
Compare
262c4d1
to
a7b16ea
Compare
c7602c2
to
f008801
Compare
a7b16ea
to
9695afe
Compare
f008801
to
847006f
Compare
c229789
to
a723a9a
Compare
847006f
to
d9255bc
Compare
a723a9a
to
ffe7d2e
Compare
d9255bc
to
4f29ff3
Compare
ffe7d2e
to
ab9ca27
Compare
4f29ff3
to
5840bce
Compare
ab9ca27
to
50e4a63
Compare
5840bce
to
3f7f6b6
Compare
50e4a63
to
8fb9382
Compare
3f7f6b6
to
42b8f0b
Compare
8fb9382
to
431149f
Compare
42b8f0b
to
b716554
Compare
Relates to #201.
After we've validated the binary signature, we exec
coder version --output=json
to validate the version of the downloaded binary matches the server. This is done to prevent against downgrade attacks, and to match the checking we had on the dylib before.Additionally, this PR also ensures the certificate used to sign the binary is part of an Apple-issued certificate chain.
I assumed we were checking this before (by default) but we weren't.
Though we weren't previously checking it, we were only ever downloading and executing a dylib.
My understanding is that macOS won't execute a dylib unless the executing process and the dylib were signed by the same Apple developer team (at least in a sandboxed process, as is the Network Extension).
Only now, when
posix_spawn
ing the slim binary from an unsandboxed LaunchDaemon, is this check absolutely necessary.