Extracting BitLocker keys from a TPM (LPC/SPI bus sniffing, TPM-only mode)¶
Varsayılan TPM-only modunda, BitLocker'ın Volume Master Key'i TPM tarafından unseal edilir ve LPC/SPI bus üzerinden CPU'ya açık (plaintext) gönderilir; burada bir bus sniffer onu yakalayabilir.
Mechanism¶
Invariant: seal'lenmiş bir secret yalnızca üzerinden gittiği tel kadar korunur
BitLocker üç anahtarı zincirler: FVEK diski şifreler, VMK FVEK'i şifreler ve protector'lar VMK'yı şifreler. Varsayılan TPM-only konfigürasyonunda tek protector TPM'dir: boot sırasında TPM platform ölçümlerini (PCR'lar) kontrol eder ve bunlar sealing policy ile eşleşirse, VMK'yı unseal eder ki Windows hiçbir kullanıcı etkileşimi olmadan boot edebilsin.
Bir TPM'in güvenlik iddiası, platform state güvenilir olmadıkça VMK'nın asla açığa çıkmamasıdır. Ancak bir discrete TPM, CPU'ya harici bir bus üzerinden bağlı ayrı bir chip'tir — tarihsel olarak LPC (33 MHz, sinyaller LFRAME#, LCLK, LAD[0:3], LRESET#) ve daha yeni board'larda SPI. TPM veriyi chip'in içinde at-rest seal'ler, ama unseal edilmiş VMK'yı döndürürken plaintext'i o bus üzerinden iletir. Trust boundary, chip'in pin'lerinde biter. TPM-only modu ikinci bir secret eklemez; dolayısıyla bus'ı pasif olarak probe edebilen bir saldırgan, VMK geçerken onu okur — fault yok, glitch yok, tasarım gereği. Kırılan invariant "VMK'yı yalnızca trusted software görür" iddiasıdır: tel üzerindeki herkes de onu görür.
Bir TPM+PIN protector eklemek saldırıyı kırar: PIN unseal'e karıştırılır, böylece TPM saldırganın bus üzerinde sahip olmadığı bir secret olmadan VMK'yı serbest bırakmaz.
Walkthrough¶
Pulse Security'den public teknik (logic analyzer üzerinden TPM1.2; FPGA üzerinden TPM2.0). Yalnızca temsili, illustrative fragment'lar — aşağıdaki kesin değerler o writeup'tan alıntıdır.
-
Bus'ı tap'le. Bir LPC debug header'ına ya da doğrudan TPM pad'lerine fly lead lehimle:
GND, LCLK, LFRAME#, LRESET#, LAD[0:3]. (SPI board'larda: CLK, CS, MISO/MOSI.) -
Boot sırasında capture al. TPM1.2 için Pulse Security bir DSLogic Plus logic analyzer kullandı; TPM2.0 için (Surface Pro 3) modifiye edilmiş bir
lpc_sniffer_tpmbitstream çalıştıran ~$40'lık bir Lattice iCEstick FPGA, ring buffer overflow olmasın diye ilgili TPM register adresine filtrelendi. -
VMK'yı trace içinde bul. VMK, TPM data FIFO'sundan okunur; writeup yakalanan
[address][data][rw]kayıtlarını filtreler ve byte'ları yeniden birleştirir. TPM response'undaki VMK, tanınabilir bir header pattern'i ile prefix'lenir, örn.:
# illustrative reassembly from the FPGA UART log (per Pulse Security)
cut -f2 -d"'" log | grep '24..00$' \
| perl -pe 's/.{8}(..)..\n/$1/' \
| grep -Po "2c0000000100000003200000(..){32}"
# -> 9a126146b5b285c93f7c4bcd372f91d0181fe7eddc44e588459ebdb244d97baa
- FVEK'i geri elde et ve volume'u decrypt et. VMK elindeyken, encrypted FVEK'i (nonce + MAC + ciphertext) volume metadata'sından çek ve decrypt et, sonra mount'la:
./dislocker-metadata -V surface_pro.img -o $((1492992*512)) # extract encrypted FVEK
# decrypt FVEK with VMK (libbde / dislocker), then:
bdemount -k <FVEK> -o $((1492992*512)) surface_pro.img /mnt/bitlocker
mount -o ro /mnt/bitlocker/bde1 /mnt/ntfs
??? example "TPM-only neden ön koşuldur" Hiçbir PIN karıştırılmadığı için TPM, her boot'ta VMK'yı otomatik olarak unseal eder. Saldırgan hedefi sadece power'lar ve kaydeder — brute-force edilecek bir secret ve defet edilecek bir kullanıcı etkileşimi yoktur. TPM+PIN, smart card ya da startup-key modları bu bedava unseal'i ortadan kaldırır.
Detection¶
- Sadece "BitLocker = On" değil, protector konfigürasyonunu audit et. Protector'ları enumerate et ve TPM-only volume'ları işaretle:
manage-bde -protectors -get C:
# "TPM" only (no "TPM And PIN" / "Numerical Password" PIN) => sniffable
- Physical tamper evidence. Bus sniffing, chassis'i açmayı ve TPM/LPC/SPI pin'lerine lehimlemeyi ya da clip'lemeyi gerektirir; tamper-evident seal'ler ve chassis-intrusion switch'leri erişimi tespit etmeye yardımcı olur.
- Uygun olduğunda fTPM'i tercih et. SoC içindeki bir firmware TPM'in clip'lenecek açık bir harici bus'ı yoktur; bu da LPC/SPI sniff surface'ini ortadan kaldırır (tehdidi başka saldırılara kaydırır).
Mitigation¶
- Bir pre-boot secret ekle: TPM+PIN (ya da startup key / smart card). Bu birincil düzeltmedir — Microsoft ve her public writeup bunu önerir; PIN otomatik VMK serbest bırakılmasını önler.
- TPM bus / parameter encryption'ı etkinleştir. TPM 2.0, CPU ile TPM arasında encrypted session'ları (HMAC + parameter encryption) destekler ki VMK bus'ı plaintext olarak geçmesin; daha yeni Windows/firmware bunu negotiate edebilir.
- Harici olarak probe edilebilir bir bus'ı olmayan fTPM / Pluton sınıfı integrated TPM'leri kullan.
- Yüksek değerli endpoint'ler için tam pre-boot authentication ile birleştir ki çalınmış, seal'lenmiş bir cihaz kullanıcı secret'ı olmadan hiçbir şey vermesin.
Bu, interposer saldırılarının istismar ettiği aynı trust-boundary-at-the-pins problemidir; bkz. tpm-genie-interposer-attacks-against-the-trusted-platform.md ve timing/lattice tarafı için tpm-fail-tpm-meets-timing-and-lattice-attacks.md.