RocksDB 유닛 테스트, CPU 버그를 찾아내다: 하드웨어 결함의 발견!

by DD
2개월 전
조회수 8

RocksDB의 유닛 테스트가 CPU 하드웨어 버그(Hardware Bug)를 발견, CVE 할당

고유 식별자(Unique Identifiers) 생성 과정에서 CPU의 RDSEED 명령어의 무작위성(Randomness) 문제 발생

AMD Zen 5 프로세서의 RDSEED 명령어에서 16/32비트 버전의 문제점 확인

커뮤니티에서는 RDSEED 명령어의 동작 방식마이크로코드(Microcode) 복잡성에 대한 논의 진행

RocksDB의 고유 식별자 생성과 CPU 버그의 연관성

RocksDB는 캐싱을 위해 SST 파일(SST Files)에 고유 식별자를 사용하며, 이는 OS 파일 시스템의 종속성을 줄이기 위한 시도였다. 하지만, std::random_device를 사용한 유닛 테스트에서 CPU 버그로 인해 고유 식별자 생성(Unique Identifier Generation)에 문제가 발생했다. 특히, AMD Zen 5 프로세서의 RDSEED 명령어가 0을 반환하는 빈도가 예상보다 높게 나타났다.

RDSEED 명령어의 문제점 분석

AMD Zen 5 프로세서의 RDSEED 명령어는 16비트 및 32비트 형태에서 무작위성(Randomness) 문제가 발생했다. 이는 RDSEED 명령어(RDSEED Instruction)가 특정 조건에서 0을 반환하는 빈도가 증가하는 버그로, RocksDB의 유닛 테스트에서 발견되었다. 마이크로 아키텍처(Microarchitecture)의 복잡성으로 인해 발생한 문제로, AMD는 64비트 RDSEED 명령어는 영향을 받지 않는다고 밝혔다.

CPU 버그 발견 과정과 대응

RocksDB 개발팀은 여러 스레드를 사용하여 고유 식별자를 생성하는 유닛 테스트를 통해 CPU 버그를 발견했다. 테스트는 std::random_device, 환경 변수 해시, 플랫폼별 UUID 생성기를 사용했으며, 특정 하드웨어에서만 테스트가 실패하는 것을 확인했다. AMD는 이 문제를 인지하고 CPU 마이크로코드 업데이트(CPU Microcode Update)를 통해 해결할 계획이다.

커뮤니티의 기술적 논의

커뮤니티에서는 RDSEED 명령어의 동작 방식과 마이크로코드(Microcode)의 복잡성에 대한 논의가 진행되었다. 특히, 32비트 난수를 생성하는 과정이 64비트 난수를 생성한 후 마스크하는 것과 동일하지 않다는 점에 주목했다. 이는 RDSEED가 엔트로피(Entropy)를 절약하기 위해 16/32비트 명령어의 마이크로코드를 더 복잡하게 만들었기 때문일 수 있다는 추측이 제기되었다.

RocksDB development finds a CPU bug