“As long as a government can come and shoot you, you can’t jump on the Internet to freedom.”
-Esther Dyson
Chromebooks. Love them or hate them, we’ve all used one before - otherwise, you wouldn’t be reading this guide. The only problem is how terribly slow and laden with spyware they tend to be when under enterprise enrollment.
Okay, let’s cut to the chase. We both know why you’re here, and it’s not to read this (marvelously well-written) preface. Unfortunately, there’s some stuff that needs to be covered before we can continue:
This guide (the “Guide”) has been created purely for the purposes of academic research and for the development of effective defensive techniques. It is not intended to be used to attack, steal, or harm systems except where explicitly authorized. Project maintainers are not responsible or liable for misuse of the Guide or related software. Any personal, professional, or financial harm that may arise out of following the Guide is entirely the fault of the individual following the guide, not the authors. This guide involves disassembly of the target device (the “Device”), which will most likely void any and all warranties that are held over the Device. Use responsibly.
My lawyer told me to put that there.
Now that we’ve got that out of the way, let’s get to the fun part! This guide will involve some disassembly, and may require specialized hardware. Here’s a list of everything you could possibly need, regardless of your target device:
Got everything you need? Great. Let’s get started.
Continue to I - Identifying Device Information
“Military intelligence is the key to war; without it, you cannot win.”
-Sun Tzu
In this section, we determine the necessary version and board information of the target device, which will be required later. If you already know this information, you can safely skip to Step 3.
If you are able to log into the device:
Google Chrome
103
, or as it is commonly abbreviated, v103
.If you are unable to log into the device:
chromeOS’s version is visible on its login screen in the top right corner. Find the first number in the version string (see image below). This is your release milestone, or as it is sometimes referred to, your chromeOS version. For example, the release milestone of the device of which the picture below was taken is 72
, or as it is commonly abbreviated, v72
.
If you are able to log into the device:
stable-channel
(see image below, highlighted in blue) and note it down. This is your board, and it is a denotation of the exact hardware configuration that the target device has. Also note down the text after Google_
- this is your device codename, and it is critical in later steps. In the case of the image below, that is fleex
.If you are unable to log into the device:
Esc+Refresh+Power
for a few seconds, then release the keys.Tab
and a debug overlay will appear (see image below). Find the row starting with active firmware id
and trace it across to the text after Google_
- you should write down the next word (your device’s codename), which in the case of the image below is Phaser
.If your target device’s board is in this list:
- (A-B) ambassador, brask, brya
- (C) clapper, coral, corsola
- (D-E) dedede, enguarde
- (G) glimmer, grunt
- (H) hana, hatch
- (J-N) jacuzzi, kukui, lulu, nami
- (O) octopus, orco
- (P-R) pyro, reks
- (S) sentry, stout, strongbad
- (T-Z) tidus, ultima, volteer, zork
Then you should proceed to Step 4.
Otherwise, continue to III - Setting GBB Flags (Ch341a)
Your target device is vulnerable to the SH1mmer exploit. Now, we must asses the current chromeOS version on the device to determine the next steps.
If your device is on a version lower than
v114
, then continue to II - Setting GBB Flags (Pre-Tsunami)
If your device is on a version equal to or higher than
v114
, then continue to III - Setting GBB Flags (Ch341a)
““It strikes me that the only real reason to take apart a pocket watch, or a car engine, aside from the simple delight of disassembly, is to find out how it works. To understand it, so you can put it back together again better than before, or build a new one that goes beyond what the old one could do.”
-Kurt Busiek
This section requires use of a screwdriver appropriate to fit the case screws of your target device, usually Phillips or Torx.
In this section, we disassemble the device partially in order to disable hardware write-protect, then build SH1mmer and flash it to a drive in order to use it to set the GBB flags to unblock developer mode permanently.
kindred
, board hatch
), making sure not to damage the ports for lubricant, marked by Xs below.Ctrl+F
to find your device codename on the page.This is where the path diverges.
If the target device uses CR50 (battery) write-protect, continue to Step 3
If the target device uses CR50 (jumper) write-protect, continue to Step 4
If the target device uses a different type of write-protect then those listed here, you are in a very rare scenario and should consult MrChromebox’s wiki page on the topic for more help, then continue to Step 5
Continue to Step 5
Continue to Step 5
Esc+Refresh+Power
) and press Ctrl+D
. Press Enter
to enable developer mode (see image below).Payloads
. Press enter, and you should be at a text-based menu.Defog
and press enter.Refresh+Power
and remove the USB drive.Ctrl+D
to enter developer mode, and wait for it to enable. This will take 5 minutes (which is an arbitrary delay), and you can watch the timer in the top left of the screen.Ctrl+D
again to boot to the login screen.Ctrl+Shift+Alt+R
to begin a powerwash. The system will reboot multiple times during the course of the process, so press Ctrl+D
whenever the warning screen appears. When the system boots again, DO NOT PROCEED WITH ENROLLMENT OR SETUP! Instead, immediately press Ctrl+Alt+Forward (F2)
on the keyboard to enter the developer console.root
and pressing enter. If you’re prompted for a password, enter test0000
- the text will not appear but it will nevertheless be there.tpm_manager_client take_ownership
cryptohome --action=remove_firmware_management_parameters
Ctrl+Alt+Back (F1)
to exit the developer console and press Ctrl+Shift+Alt+R
to powerwash again.Refresh+Power
to reboot and press Space
and then Enter
to disable developer mode.If your goal is to keep your device enrolled while still disabling extensions and having developer mode functionality, continue to IV - Flashing murkmod (SH1mmer-SMUT)
Otherwise, if you want to fully unenroll your device, continue to V - Unenrolling (SH1mmer)
“Science isn’t about why - it’s about why not. Why is so much of our science dangerous? Why not marry safe science if you love it so much? In fact, why not invent a special safety door that won’t hit you in the butt on the way out, because you are fired!”
-Cave Johnson, Portal 2
This section requires use of a screwdriver appropriate to fit the case screws of your target device, usually Phillips or Torx, a Ch341a USB flash programmer, and a chip clip/probe appropriate for the type of flash that your Chromebook uses, usually 3v WSON-8 (for newer models). You will also need an external Linux device, preferably running Ubuntu 23.04 - other distros will work, but these instructions will not cover discrepancies.
In this section, we disassemble the device and remove the motherboard in order to flash custom GBB flags directly to the read-only firmware on the device.
kindred
, board hatch
), making sure not to damage the ports for lubricant, marked by Xs.This is a question I’ve been asked time and time again. Although kindred
Chromebooks are used for reference throughout Step 3, you should not remove the motherboard of a kindred
chromebook to reprogram your SPI flash chip. On kindred
(and many other newer) devices, the flash chip is in a WSON-8 format on the front of the motherboard, and looks like the image below:
If you do not need to remove your motherboard to access the flash chip, skip to Step 4.
Heads up: If you have it, wear ESD gear - it will reduce the chances of you damaging your Chromebook while poking around inside.
25Q128JVPM
. A quick search using the query "25Q128JVPM"
yields: “W25Q128JV-DTR 3V 128M-BIT SERIAL FLASH MEMORY WITH DUAL/QUAD SPI & QPI & DTR”. DId you catch that? Right there - see it? 3V
. Some chips require 1.8 volts, so be careful not to overvolt your chip! If you are unsure of what voltage your flash chip uses, start with 1.8v and move to 3v if needed.sudo su
and enter your password if prompted. In the opened root shell, run flashrom -p ch341a
. flashrom should identify the flash chip connected to the Ch341a (see output below) - otherwise, you should verify all connections and try again.flashrom
successfully identifies the flash chip, run flashrom -p ch341a -i GBB -r "./gbb.bin"
. This will dump the GBB (Google Binary Block) currently stored on the flash chip to your Linux system, which we will modify.apt install vboot-kernel-utils
(or the equivalent for your system’s package manager) and wait for the package to install. Run futility gbb -s --flags="0x8091" "./gbb.bin"
to set the GBB flags on the dumped file, and wait for it to complete.Careful: this step writes to the flash chip and it is critical that you make sure it finished correctly before reassembling the device!
flashrom -p ch341a -i GBB --fast-verify -w "./gbb.bin"
to flash the modified GBB image back to the device’s flash chip.Confident you can do this yourself? Go right ahead - it should be the exact reverse of the steps above. Since you already know what you’re doing from before, I’ll just gloss over the steps required to replace the motherboard back in your target device:
Side note: now is a good time to make modifications to the cooling of the device - eg. replacing the fan or heatsink, adding custom components, etc.
Remember that any aftermarket parts are not guaranteed to fit and your mileage may vary depending on what components you may choose to add. Generally, custom design and manufacture (eg. 3D printing) of specific components to fit the exact model and dimensions of Chromebook you’re working with will be your best choice.
If your goal is to keep your device enrolled while still disabling extensions and having developer mode functionality, continue to VI - Installing murkmod (Devmode)
Otherwise, if you want to fully unenroll your device, continue to Step 8
If your target device’s board is in this list:
- (A-B) ambassador, brask, brya
- (C) clapper, coral, corsola
- (D-E) dedede, enguarde
- (G) glimmer, grunt
- (H) hana, hatch
- (J-N) jacuzzi, kukui, lulu, nami
- (O) octopus, orco
- (P-R) pyro, reks
- (S) sentry, stout, strongbad
- (T-Z) tidus, ultima, volteer, zork
Then you should proceed to Unenrolling (SH1mmer).
Otherwise, proceed to Unenrolling (Devmode)
This section is outdated and is only kept here for posterity. It is reccomended that you use the murkmod developer mode installer unless you plan to flash a large quantity of devices in a row with murkmod, or plan to re-flash later.
“Heh… SMUT… you know, that’s actually an acronym. Yeah, an acronym for SH1mmer Multiboot UTility. I did that on purpose - it’s funny as fuck - and I think MercuryWorkshop still hates me for it!”
-rainestorme
Esc+Refresh+Power
for 1 second and release it, then wait for the recovery screen to appear.Ctrl+D
then Enter
to enable developer mode.Esc+Refresh+Power
once the system reboots.Payloads
and press enter.SMUT (Sh1mmer Multiboot UTility)
and press enter.n
and press enter.1
and press enter.fdisk -l
and identify the correct drive from it - on most Chromebooks using eMMC, this will be /dev/mmcblk1
, and on Chromebooks using SATA drives, this will be /dev/sda
. Type out that drive name and press enter, once again making sure not to make any typos.Ctrl+D
at the developer mode warning screen and go through the enrollment process like normal. If enrollment fails with an error about not being able to obtain an enrollment certificate, continue following this step. Otherwise, you can skip directly to Step 4.Refresh+Power
and wait for the developer mode warning screen. Press Space
and then Enter
to disable developer mode.Refresh+Power
. Wait for the “ChromeOS is missing or damaged” screen to appear, then enter recovery mode once again and press Ctrl+D
and Enter
to re-enable developer mode.Continue to VIII - Configuring murkmod
“No prison can hold me; no hand or leg irons or steel locks can shackle me. No ropes or chains can keep me from my freedom.”
-Harry Houdini
If you haven’t already, follow the instructions in A. Building SH1mmer to prepare a drive with SH1mmer.
Esc+Refresh+Power
for 1 second and release it, then wait for the recovery screen to appear.Ctrl+D
then Enter
to enable developer mode.Esc+Refresh+Power
once the system reboots.Utilities
and press enter.Un-enroll device
and press enter. Wait for the process to complete, then press Refresh+Power
to reboot the device.Space
and then Enter
to disable developer mode, and wait for the system to boot into the setup flow.Ctrl+Shift+Alt+R
to powerwash the system. Select Powerwash
, then wait for the process to complete.At this point, the target device should be fully unenrolled and it should be usable as a personal Chromebook, free of all restrictions. What you do from here is up to you. Have fun!
View appendix entry C. Reverting Unenrollment for a guide on how to revert the device back to being enrolled.
“Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work.”
-Steve Jobs
Esc+Refresh+Power
) and press Ctrl+D
and then Enter
to enable developer mode.Ctrl+D
at the warning and then wait 5 minutes for the developer mode delay (there’s a timer in the top left).Ctrl+Alt+Forward (F2)
to access the developer console.root
and pressing enter.
test0000
.bash <(curl -SLk https://bit.ly/murkmod)
and press enter.Ctrl+D
at the developer mode warning screen and go through the enrollment process like normal. If enrollment fails with an error about not being able to obtain an enrollment certificate, continue following this step. Otherwise, you can skip directly to Step 4.Refresh+Power
and wait for the developer mode warning screen. Press Space
and then Enter
to disable developer mode.Refresh+Power
. Wait for the “ChromeOS is missing or damaged” screen to appear, then enter recovery mode once again and press Ctrl+D
and Enter
to re-enable developer mode.Continue to VIII - Configuring murkmod
“The only thing we have to fear is fear itself. Oh, and also the IT department.”
-rainestorme
Esc+Refresh+Power
) and press Ctrl+D
and then Enter
to enable developer mode.Ctrl+D
at the warning and then wait 5 minutes for the developer mode delay (there’s a timer in the top left).Ctrl+Alt+Forward (F2)
to access the developer console.root
and pressing enter.
test0000
.vpd -i RW_VPD -s check_enrollment=0
and press enter.vpd -i RW_VPD -s block_devmode=0
and press enter.crossystem block_devmode=0
and press enter.Ctrl+Alt+Back (F1)
and then press Ctrl+Shift+Alt+R
to powerwash the system.At this point, the target device should be fully unenrolled and it should be usable as a personal Chromebook, free of all restrictions. What you do from here is up to you. Have fun!
View appendix entry C. Reverting Unenrollment for a guide on how to revert the device back to being enrolled.
“It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change.”
-Charles Darwin
Ctrl+Alt+T
). If you can’t open crosh due to an extension block, then create a new folder in your Downloads named disable-extensions
. murkmod will automagically disable extensions so you can use crosh.Open crosh (Ctrl+Alt+T
) and select “Install Plugins”. Use the arrow keys to navigate and select the following plugins:
Press q
to exit.
Select “Hard Disable Extensions” and, at the prompt, enter the extension ID corresponding to the extension you want to disable:
haldlgldplgnggkjaafhelgiaglafanh
iheobagjkfklnlikgihanlhcddjoihkg
(webstore extension) or joflmkccibkooplaeoinecjbmdebglab
(non-webstore extension)feepmdlmhplaojabeoecaobfmibooaid
enfolipbjmnmleonhhebhalojdpcpdoo
inoeonmfapjbbkmdafoankkfajkcphgd
cgbbbjmgdpnifijconhamggjehlamcif
dikiaagfielfbnbbopidjjagldjopbpa
adkcpkpghahmbopkjchobieckeoaoeem
jcdhmojfecjfmbdpchihbeilohgnbdci
jdogphakondfdmcanpapfahkdomaicfa
aceopacgaepdcelohobicpffbbejnfac
kmffehbidlalibfeklaefnckpidbodff
jaoebcikabjppaclpgbodmmnfjihdngk
ghlpmldmjjhmdgmneoaibbegkjjbonbk
ddfbkhpmcdbciejenfcolaaiebnjcbfc
jfbecfmiegcjddenjhlbhlikcbfmnafd
jjpmjccpemllnmgiaojaocgnakpmfgjg
Search
key). It will prompt you to perform initial configuration. Leave the default value for everything (except the color theme, feel free to mess with that). If prompted to log in, just select “Log in with Google” and sign in with your home account, or use an anonymous account provided by the Aurora Store.helper
folder into the very root of your Downloads folder.chrome://extensions
and enable Developer Mode with the switch in the top right.Load Unpacked
and select the helper
folder you unzipped before.The target device is now fully configured to use murkmod with the recommended settings and plugins. From here, what you do is your choice. Have fun!
View appendix entry B. Reverting murkmod for a guide on how to revert the target device back to a stock state.
“I have not failed. I’ve just found 10,000 ways that won’t work.”
-Thomas A. Edison
git wget
git clone https://github.com/cognito-inc-real/sh1mmer-smut.git
and then cd sh1mmer-smut
v105 (og)
, v107 (mercury)
, v117 (john)
, or v118 (pheonix)
, and I recommend either v105
or v118
(codenames og
and pheonix
, respectively).reco_image.bin
. Move it to the typewriter
directory in the repository you just cloned.typewriter
directory and rename it to raw_shim.bin
.cd typewriter
and then run chmod +x typewriter.sh
.sudo ./typewriter.sh
and wait for the process to complete. This will take a while. Your completed shim will be located at /path/to/sh1mmer-smut/typewriter/sh1mmer_smut.bin
.wax
folder in the repo you cloned. Rename the file to sh1mmer.bin
and run sudo ./wax.sh sh1mmer.bin
./path/to/sh1mmer-smut/wax/sh1mmer.bin
Use Local Image
) or a better program for your OS.dd
to flash the image to your USB drive: dd if=/path/to/sh1mmer.bin of=/dev/sdX status=progress
where /dev/sdX
is the path to your drive.(8) Emergency Revert & Re-Enroll
.Space
and then Enter
to disable developer mode.Ctrl+Alt+Forward (F2)
to enter the developer console.shell
to get to a bash shell.vpd -i RW_VPD -s check_enrollment=1
vpd -i RW_VPD -s block_devmode=1
crossystem block_devmode=1
echo "fast safe" > /mnt/stateful_partition/factory_install_reset
reboot
“Alone we can do so little; together we can do so much.”
-Helen Keller
The following people and groups greatly assisted with the development of this guide:
aw_somewhere
on Discord) - Devices for testing