- 암호 없는 BitLocker가 별도 TPM(discrete TPM) 에 의존하면, 부팅 중 VMK가 TPM에서 CPU로 전달되는 순간 SPI 버스에서 평문 키를 캡처할 수 있음
- Lenovo L13 실험은 100달러 미만의 DSLogic Plus로 진행됐지만, 33MHz SPI 버스를 안정적으로 읽기에는 샘플링 한계가 컸음
- 캡처 데이터는 SPI → TIS → TPM 2.0 순서로 해석해야 하며,
TPM2_Unseal응답 버퍼에서5761로 시작하는 32바이트 키를 찾아냄 - 추출한 키로
dislocker-fuse를 이용해 BitLocker 파티션을 마운트하고,sethc.exe를cmd.exe로 바꿔 Shift 5회 입력으로 SYSTEM 셸까지 얻음 - 별도 TPM만으로는 충분한 보호가 어렵고, 실질적인 방어는 fTPM 사용 또는 BitLocker PIN·패스프레이즈 설정에 달려 있음
암호 없는 BitLocker와 별도 TPM의 약점
- BitLocker 파티션은 FVEK(Full Volume Encryption Key) 로 암호화됨
- FVEK는 다시 VMK(Volume Master Key) 로 암호화되어, 암호화된 데이터와 함께 디스크에 저장됨
- 이 구조 덕분에 전체 디스크를 다시 암호화하지 않고도 키 회전이 가능함
- VMK는 TPM에 저장됨
- 따라서 디스크는 해당 컴퓨터에서 부팅될 때만 복호화될 수 있음
- Active Directory에는 복구 메커니즘이 있음
- 취약한 지점은 CPU가 디스크 복호화를 위해 TPM에 VMK 전송을 요청하는 순간임
- VMK가 TPM과 CPU 사이의 SPI 버스를 평문으로 지나감
- 이 값을 캡처하면 BitLocker 디스크 복호화에 사용할 수 있음
TPM 통신 캡처에 쓴 장비
- 실험 장비는 DSLogic Plus 로직 분석기임
- 2021년에 세금과 배송비 포함 100달러 미만에 구매함
- 신호를 안정적으로 얻으려면 샘플링 주파수가 버스 주파수의 3~4배 정도 필요함
- 대상 SPI 버스는 33MHz라 최소 100MHz 샘플링이 필요함
- DSLogic Plus 사양은 최대 16채널에서 400MHz를 말하지만, 실제 사용 조건에는 제약이 있음
- DSLogic Plus는 캡처 방식과 채널 수에 따라 한계가 뚜렷함
- 동시에 캡처하는 채널 수가 늘어나면 샘플링 주파수가 낮아짐
- 스트림 모드는 약 1분 동안 큰 데이터를 캡처할 수 있지만, 3채널에서 100MHz로 제한됨
- 버퍼 모드는 400MHz 샘플링이 가능해도 몇 밀리초만 동작해 이 작업에는 실용적이지 않음
- 더 전문적인 선택지는 약 10배 비싼 Saleae이며, 다른 장비는 sigrok 지원 하드웨어 목록에서 확인할 수 있음
보드 연결과 캡처 타이밍
- SPI는 공유 버스라 작은 TPM 핀에 직접 연결할 필요가 없음
- 같은 SPI 버스에 연결된 더 큰 부품이 있으면 그쪽에 훅을 걸 수 있음
- 실험에서는 근처의 SPI flash를 식별해 사용함
- 부품 표기가 있어 데이터시트를 찾아 용도를 확인하기 쉬웠음
- DSLogic으로는 샘플링 주파수 하락 때문에 SPI 라인 중 3개만 캡처함
- 중요한 라인은 CLK, MOSI, MISO임
- 임계 전압은 신호 전압의 절반 정도로 잡아야 함
- 측정된 신호 전압은 3.3V였고, 적절한 임계값은 약 1.6V였음
- 찾는 VMK는 POST 단계 후반에 사용됨
- Lenovo L13에서는 스플래시 화면 직후, 전체 약 25초 부팅 중 약 14초 지점이었음
- 그 전에도 SPI 동작은 있지만 주로 초기 부팅 단계 읽기와 검증이며 TPM 통신은 아니었음
- 부팅 직후 캡처를 시작하거나, 불필요한 데이터를 줄이려면 약 7초 뒤 시작할 수 있음
SPI, TIS, TPM 2.0 해석
- 캡처 신호는 SPI, TIS, TPM 2.0 세 계층으로 나눠 해석해야 함
- SPI는 단순한 프로토콜이라 일반 로직 분석기로도 해석 가능함
- 클럭이 0에서 1로 올라가는 순간 데이터 라인의 상태가 비트 값이 됨
- 예시에서 MOSI는 8클럭 동안 0이라
0x00, MISO는 첫 비트만 켜져0x80으로 해석됨
- 가장 어려운 부분은 TIS(TPM Interface Specification) 였음
- 동작하는 디코더를 찾지 못해 수동으로 처리함
- libsigrok decoders는 정확한 데이터 해석에는 실패했지만, TPM 교환이 일어나는 대략적 구간을 찾는 데 도움이 됨
- 실패 원인은 캡처에 Chip Select가 없거나, 클럭이 부정확하거나, 일부 바이트가 빠졌거나, 다른 이유일 수 있음
- 마스터에서 슬레이브로 보내는 요청은 반복적인 패턴을 보임
- 슬레이브가 준비 상태를 알리는
80을 보냄 - 마스터가
D4 00 24헤더와 TPM 바이트를 보냄 - 슬레이브가
01 FF로 읽었음을 확인함
- 슬레이브가 준비 상태를 알리는
- 슬레이브에서 마스터로 가는 응답은 레지스터 설정과 읽기에 의존함
- 예시 프레임은
D4 00 24주소에서 1바이트를 읽은 결과임 - 슬레이브가
80으로 트랜잭션을 시작하고, 이후 관심 있는 값인0x80이 나타남
- 예시 프레임은
TPM2_Unseal 응답에서 키 찾기
- 키 반환을 요청하는 TPM 명령은 TPM2_Unseal임
- 이 명령은 TPM 2.0 specification part 3에 정의되어 있음
- 요청 프레임보다 MISO 라인의 응답에 집중해 TPM 트랜잭션을 분리함
- 원시 SPI 데이터에서
80 00 00 00 01 ..마스크로 필터링하고 마지막 와일드카드 바이트만 유지함 - TPM 트랜잭션 시작은
80 01또는80 02헤더로 식별됨 - 키가 든 응답은 더 긴 인증 응답이며
80 02로 시작함
- 원시 SPI 데이터에서
- Unseal 명령과 응답 사이에는 약 10ms 지연이 있었음
80 02헤더는 패스워드 세션을 나타내며, 대부분의 요청이 쓰는 평문80 01헤더와 다름- 요청 인증과 응답 HMAC 처리 때문에 지연이 생긴 것으로 보임
- TPM 명령과 응답은 바이트를 하나씩 재조립해 얻음
- 디코딩에는 tpmstream-web 도구를 사용함
- 응답 버퍼 안의 키는
5761로 시작하며 길이는 32바이트임
디스크 마운트와 백도어
- 추출한 키를 파일로 저장한 뒤
dislocker-fuse에 넘겨 BitLocker 파티션을 마운트함 - 예시 명령은 키 파일을 만들고
/dev/sdd3를./mnt/에 연결한 뒤,dislocker-file을 다시./mnt2/에 마운트함 - 가장 단순한 백도어는 Windows의 sticky keys 프로그램을
cmd.exe로 덮어쓰는 방식임Windows/System32/cmd.exe를Windows/System32/sethc.exe로 복사함- 디스크를 노트북에 다시 넣고 부팅한 뒤 Shift 키를 5번 누르면 SYSTEM 셸을 얻음
장비 한계와 방어책
- DSLogic은 이 작업에 추천하기 어려움
- 많은 캡처가 실패해 버려야 했음
- 버스 속도의 3배 샘플링은 일관된 클럭을 얻기에 겨우 충분했고 일부 바이트가 빠졌음
- 장비 한계 때문에 프로토콜을 깊게 이해하고 캡처를 수동으로 해석하는 데 시간이 많이 들었음
- 고용주가 장비를 구매하는 상황이라면 전문 로직 분석기를 사는 편이 낫다고 봄
- 별도 TPM 사용은 기대와 달리 시스템 보안을 높이지 않으며 보안의 환상을 만들 수 있음
- 방어책은 두 가지임
- fTPM을 사용함
- 별도 TPM을 써야 한다면 BitLocker에 PIN 또는 패스프레이즈를 설정함
- Microsoft도 더 높은 수준의 데이터 보호가 필요한 조직 영역에는 BitLocker PIN 또는 패스프레이즈 설정을 권고함