DRAM을 스파게티처럼 뒤엉키게 만들기

5 days ago 16

skitter-creek-bath-salts는 실행 중인 시스템의 DRAM 주소 변환을 재배선해 커널에도 보이지 않는 보호 영역을 별칭 주소로 읽고 쓰는 연구 프로젝트임 AMD Family 16h의 DCT bank-swizzle 비트 하나를 바꾸면 물리 주소와 DRAM 좌표의 대응이 달라지며, 상위 계층에서 물리 주소를 기준으로 작동하는 메모리 보호 장벽을 우회할 수 있음 미지의 주소 변환은 sentinel의 원래 주소와 별칭 주소 쌍을 수집한 뒤 GF(2) 선형대수와 z3로 복원해, 임의의 보호 주소에 대응하는 접근 가능한 별칭을 계산함 이 방식으로 PSP·SMRAM·C6 상태 저장 영역·CPU microcode를 추출할 수 있으며, dram_poke를 사용하면 C6 복귀 때 다시 적재되는 microcode 사본도 수정할 수 있음 구현과 검증 대상은 문서화된 DRAM 컨트롤러 레지스터를 잠글 수 없는 AMD Family 16h이며, 17h 이후와 다른 아키텍처에도 같은 메모리 파이프라인 구조가 있지만 이 프로젝트가 직접 입증한 범위는 아님 물리 주소 아래의 DRAM 변환 계층 코드가 *p를 역참조해도 p가 곧바로 DRAM 위치를 뜻하지는 않음 가상 주소는 정규형 검사, 세그먼트 기준 주소, TLB와 페이지 테이블, 권한 검사, 게스트 EPT/NPT를 통과함 이후 메모리 유형, 캐시 일관성, 시스템 인터커넥트와 MMIO 판정을 거쳐 메모리 컨트롤러에 도달함 마지막 MCT/DCT 계층은 물리 주소에 DRAM hole remap, 보호 영역 remap, channel·rank·bank interleave, bank swizzle, chip-select 정규화를 적용해 DIMM의 bank group·bank·row·column 좌표로 변환함 프로젝트는 물리 주소가 원시 DRAM 좌표로 마지막 변환을 거치는 이 최하위 계층을 조작함 DRAM 스파게티화 방식 AMD Family 16h에서 0xf80c2094의 bank-swizzle-mode 비트를 뒤집으면 DCT의 주소 변환이 바뀌어 같은 주소가 실행 도중 다른 DRAM 위치를 가리키게 됨 CPU·펌웨어·칩셋의 보호 장치는 DRAM 좌표가 아니라 물리 주소를 감시하므로, 그 아래에서 좌표 대응을 바꾸면 기존 장벽이 변화를 인식하지 못함 시스템 전체 메모리가 함께 뒤섞이므로 단순히 변환 비트를 바꾸는 것보다 플랫폼을 계속 실행시키는 일이 어려움 다른 프로세서를 중지하고 ...

Read Entire Article