
CVE-2024-21980 익스플로잇: 명령 버퍼 강제 우회를 통해 폐기된 SEV-SNP 게스트의 임의 메모리를 복호화하는 AMD SEV 펌웨어 대상 공격.
이 저장소는 SEV 펌웨어의 취약점에 대한 익스플로잇을 포함합니다. 이 익스플로잇은 SEV-SNP 게스트가 폐기(decommission)된 후 임의 메모리를 복호화할 수 있도록 합니다.
버전 1.55.16 (현재 최신 버전)에서 테스트되었습니다.
SEV 펌웨어에는 모든 명령어에 대한 함수 포인터와 명령어와 관련된 몇 가지 추가 속성을 포함하는 master_handler_table이라는 테이블이 있습니다. 그 추가 속성 중 두 가지는 cmd_buf_type과 snp_cmd_buf_enforcement입니다. cmd_buf_type은 명령어 버퍼를 호스트 메모리로 복사하거나 호스트 메모리에서 복사해야 하는지 여부를 결정합니다. snp_cmd_buf_enforcement는 이러한 복사 작업이 명령어 버퍼를 지원하는 메모리가 FIRMWARE 또는 DEFAULT 상태에 있는지 확인하는 검사를 받아야 하는지 여부를 결정합니다. cmd_buf_type이 CMD_BUF_OUTPUT_ONLY, CMD_BUF_INPUT_AND_OUTPUT, 또는 CMD_BUF_INPUT_AND_OUTPUT_ERROR 중 하나인 명령어는 모두 snp_cmd_buf_enforcement가 true로 설정되어야 합니다. 그렇지 않으면 명령어 출력을 다시 쓰면 RMP 보호 영역 내에서 메모리 손상이 발생할 수 있습니다. snp_cmd_buf_enforcement는 한 가지 예외를 제외하고 이러한 모든 명령어에 대해 true입니다. 바로 SEV_MCMD_ID_ATTESTATION입니다. 이 명령어는 cmd_buf_type이 CMD_BUF_INPUT_AND_OUTPUT_ERROR로 설정되어 있지만 snp_cmd_buf_enforcement는 false로 설정되어 있습니다. 결과적으로 RMP로 보호된 메모리를 가리키는 명령어 버퍼로 SEV_MCMD_ID_ATTESTATION을 실행하고 출력이 다시 쓰여질 때 해당 메모리가 손상될 수 있습니다.
SEV_MCMD_ID_ATTESTATION이 왜 예외가 되어야 하는지 알 수 없으며, 오타나 복사-붙여넣기 실수일 가능성이 있어 보입니다.
SEV_MCMD_ID_ATTESTATION은 명령어 버퍼의 단일 필드 length(4바이트)에만 쓰기 때문에 해당 바이트만 메모리 손상에 사용할 수 있습니다. SEV_MCMD_ID_ATTESTATION은 항상 동일한 값인 0x000000d0을 씁니다. 다행히 명령어 버퍼에 정렬 요구 사항이 없으므로 명령어 버퍼를 반복적으로 이동하여 더 넓은 범위의 연속 메모리를 손상시킬 수 있습니다. 이를 사용하여 게스트 컨텍스트 페이지의 처음 16바이트를 정적 패턴으로 손상시킬 것입니다. 이 처음 16바이트는 UMC 키 시드를 포함하므로 이를 정적 값으로 강제하면 게스트의 암호화 키를 정적 값으로 강제할 수 있습니다.
여기에 제공된 익스플로잇은 SWPSIRT-2684/CVE-2023-31355에 대해 제공한 익스플로잇을 기반으로 합니다.
취약점을 악용하려면 다음 단계를 수행할 수 있습니다:
SEV_MCMD_ID_ATTESTATION에 필요합니다. 이 게스트를 계속 실행 상태로 유지합니다.0x2000에 게스트 컨텍스트 페이지를 생성합니다. RMP 보호 영역 내의 다른 주소도 가능하지만 고정 주소는 디버깅에 유용합니다.0x2000에 게스트 컨텍스트 페이지를 생성합니다. 이는 1단계에서 사용한 것과 동일한 주소여야 합니다.SNP_DBG_ENCRYPT 명령어를 사용하여 공격자 게스트의 컨텍스트 페이지를 사용하여 피해자 게스트의 메모리를 복호화합니다. 피해자 게스트와 공격자 게스트가 UMC 키 시드를 공유하므로 이 작업이 성공합니다.영향은 최소한 SWPSIRT-2684와 동일해야 합니다. 현재 이 버그가 폐기되기 전에 실행 중인 게스트의 메모리를 복호화하는 데 사용될 수 있는지는 불분명합니다.
snp_cmd_buf_enforcement는 SEV_MCMD_ID_ATTESTATION에 대해 true로 설정되어야 합니다.
흥미롭게도 Linux KVM 호스트 지원 패치는 업데이트할 필요가 없습니다. 왜냐하면 이미 SEV_CMD_ATTESTATION_REPORT를 sev_cmd_buf_writable에서 명령어 버퍼가 FIRMWARE 상태여야 하는 명령어로 나열하고 있기 때문입니다. 다른 하이퍼바이저의 경우 변경이 필요할 수도 있고 필요하지 않을 수도 있습니다.