-
Notifications
You must be signed in to change notification settings - Fork 99
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
[AIP-101][Discussion] Safe onchain key rotation address mapping for standard accounts #487
Comments
Thank you for the design review, these changes look sound, I vote for "approve". On the broader question, this raises valid concerns about |
Approved on my end. |
Looks good to me, approved. |
Approved from my end. |
Approved |
Problem statement
Authentication key mapping has functional issues that render
originating address mapping unsafe.
Generally this means that address mappings can be lost, leading to
account loss and ultimately inability to access funds purely from CLI.
Impact
This impacts projects or users who have used key rotation functionality,
in particular the unproven rotation used for exotic purposes like passkeys.
For more, see:
https://aptos.dev/en/build/guides/key-rotation
https://aptos.dev/en/build/cli/trying-things-on-chain/ledger#authentication-key-rotation
Summary
The onchain key rotation address mapping has functional issues which inhibit
safe mapping of authentication key to originating address for standard accounts.
I propose resolving these issues with the reference implementation.
Motivation
There are currently several issues with the
OriginatingAddress
table (which issupposed to be a one-to-one lookup table) that render the mapping unsafe in
practice:
OriginatingAddress
followup reconciliation function for key rotations without a proof challenge aptos-labs/aptos-core#13517,rotate_authentication_key_call
does not update theOriginatingAddress
table for an "unproven" key rotation without a
RotationProofChallenge
.already been mapped) to a different originating address, the inner function
update_auth_key_and_originating_address_table
overwrites the initialmapping, rather than aborting. This oversight can lead to account loss if
someone accidentally attempts to rotate to the same authentication key twice,
because they will not be able to identify their old account from private key
alone unless they keep an external record of the rotated accounts it has been
used to secure.
in the
OriginatingAddress
table, such that two accounts can beauthenticated by the same authentication key: the original account whose
address is its authentication key, and another account that has had its
authentication key rotated to the authentication key of the original account.
Since
OriginatingAddress
is one-to-one, a dual-account situation caninhibit indexing and OpSec.
Proposed solution
Assorted checks and extra function logic in
aptos-labs/aptos-core#14309
Alternative solutions
Per @davidiw in a separate chat:
As I understand, this approach would require breaking changes and would
introduce offchain indexing as an additional dependency in the authentication
key mapping paradigm.
My solution, captured in the proposed reference implementation, offers a
purely onchain solution to existing issues and does not require altering the
existing design space or introducing an offchain dependency.
Specification
N/A
Reference implementations
aptos-labs/aptos-core#14309
Risks and drawbacks
Enforces a one-to-one mapping of private key to account address in the general
case of following best practices, which extreme users (wishing to use one
private key to authenticate all their accounts) may find restrictive.
Security considerations
Note that the function
account::set_originating_address
proposed inaptos-labs/aptos-core#14309 must remain a private entry
function to prevent unproven key rotation attacks.
Multisig considerations
In a separate chat, @davidiw asked about how the changes in the reference
implementation will interact with multisig v2. Note that even without the
changes in this PR, it is already possible for a multisig to have an entry in
the
OriginatingAddress
table:A
to have a new authentication key, thus generating an entryin the
OriginatingAddress
table.A
to a multisig viamultisig_account::create_with_existing_account_and_revoke_auth_key
, whichwill set the account's authentication key to
0x0
, but which will notmutate the
OriginatingAddress
table, since it makes an inner call toaccount::rotate_authentication_key_internal
.OriginatingAddress
table then (incorrectly) reports that a mapping fromthe authentication key (from before multisig conversion) to the multisig
address.
Timelines
Ideally during next release
Future potentials
Potentially in a separate update, logic to eradicate the existing multisig v2
indexing issues mentioned above (which is outside the scope of what the
reference implementation intends to resolve).
Verifying changes in reference implementation
As requested by @ThePOM on 2024-09-17:
Install the Aptos CLI [from source] using the changes in this PR.
Make a new test directory called
localnet-data
, then use it to start alocalnet with the framework changes in this PR:
Save the localnet shell running off to the side.
In a new shell, create a private key file:
Use it to create a localnet profile:
aptos init \ --network local \ --private-key-file keyfile-a \ --profile localnet-a
Store the address:
Use the new
originating_address
view function to observe that the accountdoes not have an entry in the
OriginatingAddress
table:aptos move view \ --args address:$ADDR_A \ --function-id 0x1::account::originating_address \ --profile localnet-a
Use the new
set_originating_address
private entry function to set a mappingin the table:
Check the
originating_address
view function again and note the result:aptos move view \ --args address:$ADDR_A \ --function-id 0x1::account::originating_address \ --profile localnet-a
Now that you've established a one-to-one mapping for the authentication key,
the new check for
ENEW_AUTH_KEY_ALREADY_MAPPED
inupdate_auth_key_and_originating_address_table
will prevent another accountfrom rotating its authentication key to that of
keyfile-a
, thus preservinga one-to-one mapping. To verify this, create a new profile:
aptos init \ --network local \ --profile localnet-b
Press
enter
when prompted to generate a new private key for the profile.Then observe the new guard against breaking the one-to-one mapping, by
trying to rotate the authentication key to that of
keyfile-a
:The text was updated successfully, but these errors were encountered: