Welcome to the Raspberry Pi RP2350 hacking challenge and bug bounty!
Watch our quick explainer video:
No breaks have been reported yet.
We are doubling the prize to $20,000!
We've extended the term of the challenge, it now runs until midnight on December 31st 2024 (UK time)
The goal is easy: Find an attack that lets you dump a secret hidden in OTP ROW 0xc08 - the secret is 128-bit long, and protected by OTP_DATA_PAGE48_LOCK1
and RP2350's secure boot!
If you think you have found a break email us at doh@raspberrypi.com with details - we will ship you a Pico2 with a custom secret hidden in it. If you manage to extract it, you win the $20,000!
Good luck!
For this challenge we will do the following persistent & irreversible changes to your RP2350:
crit1.secure_boot_enable
(but with public keys)crit1.debug_disable
ec_private_key.pem
and ec_public_key.pem
. If you want to generate your own keys you can run keygen.sh
to generate new ones using openSSL../write_otp_secret.sh
- this is irreversible, as we can't "erase" OTP../read_otp_secret.sh
mkdir build
cd build
cmake -DPICO_PLATFORM=rp2350 -DPICO_BOARD=pico2 ..
make
cd ..
enable_secureboot.sh
(This irreversibly enables secure-boot! Make sure you keep a backup of your keys!)
lock_chip.sh
rp2350_hacking_challenge_debug_version.uf2
or rp2350_hacking_challenge_secure_version.uf2
The debug version shows how to read the OTP secret that you need to extract, and also gives some debug output on what's going on in the chip.
As the printfs etc. might be susceptible to fault-injection attacks we have disabled them in the secure version.
Our "golden" challenge Pico 2 will run the secure-version of the firmware, with the binary copied to RAM.
By participating in this challenge you are permanently enabling secure-boot on your device.
Any firmware you want to install in the firmware you need to sign yourself. You can enable
signing for other projects by simply adding this to the CMakeLists.txt (this needs to be above the pico_add_extra_outputs
) and copying the
ec_private_key.pem
to your source directoy.
# Signing and hashing
pico_sign_binary(project_name ${CMAKE_CURRENT_SOURCE_DIR}/ec_private_key.pem)
pico_hash_binary(project_name)
pico_set_otp_key_output_file(project_name ${CMAKE_CURRENT_LIST_DIR}/otp.json)
Please see here for terms, conditions and rules for this challenge.