리눅스 보안 잠금(Lockdown)은 루트 권한 사용자가 커널을 바꾸지 못하게 하지만, 최대절전 기능도 막는다. 제안된 패치셋은 신뢰 플랫폼 모듈(TPM)과 부팅 과정의 측정값을 이용해 최대절전 이미지가 커널에서 만들어졌는지 확인하는 방식으로 이 문제를 풀려 한다.

리눅스는 커널 공간과 사용자 공간을 하드웨어 수준에서 분리한다. 하지만 기존에는 루트 권한으로 커널 모듈을 불러오거나, PCI 장치의 메모리를 조작해 DMA로 커널 메모리를 덮어쓰거나, CPU의 특수 레지스터를 바꾸는 등 이 경계를 우회할 수 있었다. UEFI 보안 부팅이 도입되면서 부팅 단계에서 신뢰할 수 있는 서명만 허용하더라도, 부팅 뒤에 루트 권한으로 커널에 코드를 추가할 수 있다면 제한의 효과가 줄어든다. 리눅스의 Lockdown 보안 모듈은 커널을 변경할 수 있는 사용자 공간 인터페이스를 막고, 커널 모듈에 신뢰할 수 있는 서명을 요구한다.

문제는 Lockdown이 최대절전도 차단한다는 점이다. 리눅스는 시스템 상태를 스왑 파티션에 저장하고, 다음 부팅 때 그 내용을 메모리에 복원해 이전 커널 상태로 돌아간다. 하지만 커널은 저장된 이미지가 실제로 커널이 만든 것인지 확인하지 않는다. 루트 권한을 가진 공격자가 스왑을 직접 덮어쓰면, 부팅 뒤 공격자가 만든 이미지가 커널 공간에 복원될 수 있다. 스왑 암호화만으로는 해결되지 않는다. 공격자는 루트 권한으로 복호화된 스왑 내용에 접근할 수 있기 때문이다.

TPM으로 이미지에 쓸 암호화 키를 보호하는 방법도 충분하지 않다. 루트 권한 사용자도 TPM을 이용해 키를 만들 수 있으므로, 이미지가 해당 시스템에서 만들어졌다는 점은 확인해도 커널이 만들었다는 점까지 증명하지 못한다. 처음에는 커널만 수정할 수 있는 TPM의 PCR 23을 활용하는 방안이 고려됐지만, 이미 PCR 23을 사용하는 시스템과 충돌할 수 있어 다른 방법이 필요했다.

제안된 설계는 TPM의 비휘발성 메모리(NV) 인덱스를 커널 전용 기록 공간으로 쓰고, TPM 명령 감사 세션으로 키 생성과 기록 과정을 확인한다. 그러나 새 커널에서만 NV 인덱스 접근을 제한하면, 공격자가 구형 커널로 부팅해 사용자 공간에서 위조 이미지를 만들 수 있다. 이를 구분하기 위해 패치셋은 사용자 공간이 실행되기 전 부팅 단계에서 커널의 기능 지원 여부를 PCR 5에 기록하는 방안을 제시한다. PCR 5에는 UEFI의 ExitBootServices() 호출에 따른 측정값이 기록된다. 펌웨어가 이 호출 때 PCR 5를 실제로 갱신해야 사용자 공간이 같은 상태를 위조할 수 없다는 조건이 따른다.

초기 패치셋은 키를 만들어 서명하는 방식이었지만, 제임스 바텀리(James Bottomley)는 최대절전 이미지의 해시를 NV 인덱스에 기록하고 감사 세션에서 읽어 확인하는 개선안을 제안했다. 이 방식에서는 복원할 때 감사 로그의 진위를 검증하고, 이미지의 해시가 로그에 기록된 값과 일치하는지 확인한다. TPM의 증명 키(Attestation Key)는 감사 로그에 서명할 수 있으며, 커널은 절전 시 키를 결정적으로 생성하고 복원 시 같은 키를 다시 만들어 서명을 검증할 수 있다.

패치 제안은 리눅스 전원 관리 메일링 리스트에 올라왔으며, 검토 의견은 대체로 긍정적이라고 전해졌다. 다만 실제 펌웨어가 PCR 5를 제대로 갱신하는지, 사용자 공간에서 TPM에 직접 명령을 보내 NV 인덱스 접근 제한을 우회할 수 있는지 등이 해결 과제로 남아 있다. 이 글은 이전 글을 갱신한 버전이다.