본문 바로가기
지식/Linux

ASAN - shadow memory

by TheEC 2025. 11. 28.

ASan(AddressSanitizer) 은 메모리 안전성을 검사하는 도구로, 버퍼 오버플로우, use-after-free, stack/heap 사용 오류 등을 탐지하는 데 매우 유용합니다. ASan의 핵심적인 개념 중 하나는 shadow memory입니다.

1. Shadow Memory란?

Shadow memory는 실제 메모리 영역의 "복사본"으로, ASan이 메모리 오류를 탐지하고 추적하는 데 사용하는 "보조 메모리"입니다.

ASan은 프로그램이 사용하는 실제 메모리와는 별도로, 메모리의 각 바이트에 대한 상태를 기록하는 shadow memory를 관리합니다. 이 메모리는 실제 프로그램의 메모리 구조와는 별개로, 메모리 오류를 검출하기 위해 사용됩니다.

2. Shadow Memory 구조

Shadow memory는 메모리의 각 바이트에 대응하는 값을 저장하는 공간입니다. ASan이 실제 메모리의 각 주소를 관리하기 위해 16배 축소된 형태로 메모리 공간을 할당합니다. 이 방식은 메모리 오버헤드를 줄이면서도 효율적으로 오류를 탐지할 수 있게 도와줍니다.

예시:

  • 실제 메모리에서 1바이트가 있으면, 해당 바이트는 shadow memory에서 1/16 크기로 매핑됩니다. 예를 들어, 실제 메모리 주소 0x1000에 해당하는 데이터의 상태는 shadow memory에서 0x2000 위치에 저장됩니다.

매핑 방식:

  • 실제 메모리 주소 0x1000 -> shadow memory 주소 0x2000
  • 실제 메모리 주소 0x1001 -> shadow memory 주소 0x2001
  • ...

3. Shadow Memory의 역할

Shadow memory는 프로그램의 메모리 사용 상태를 추적하는 역할을 하며, 실제 메모리 주소에 대한 정보를 간접적으로 저장합니다. 각 메모리 바이트에 대해 **"상태 값"**을 할당하는데, 이 값은 메모리가 "유효한지" 또는 "비어있는지" 또는 "오류가 발생했는지"를 추적하는 데 사용됩니다.

 

Shadow Memory 값의 예시:

   - 0: 해당 메모리 영역은 유효하지 않거나 초기화되지 않은 상태

   - 1: 해당 메모리 영역은 정상적으로 할당되어 사용 중인 상태

   - 2~3: 특정 상태를 나타낼 수 있음(예: free된 메모리, 경계 오류 등)

   - 8 이상: 이미 해제된 메모리 영역, 잘못된 접근이 발생할 수 있는 상태

4. 어떻게 작동하는가?

실제 메모리 주소에 접근할 때, ASan은 shadow memory에서 해당 메모리의 상태를 검사합니다. 만약 잘못된 접근(예: 할당되지 않은 메모리 접근, 버퍼 오버플로우 등)이 발견되면, ASan은 오류를 보고합니다.

 

예시:

 

int *p = malloc(sizeof(int) * 10);  // 메모리 할당
p[15] = 100;  // 허용되지 않은 메모리 접근

위 코드에서 p[15]는 할당된 메모리 영역을 벗어난 버퍼 오버플로우입니다. ASan은 이 접근을 감지하기 위해 다음을 수행합니다:

  1. p가 가리키는 메모리 영역의 shadow memory를 검사하여 올바르게 할당된 영역인지 확인합니다.
  2. p[15]는 실제 메모리의 범위를 벗어난 접근이므로, shadow memory에서 해당 주소를 조회할 때 유효하지 않거나 잘못된 상태가 보고됩니다.
  3. ASan은 즉시 오류를 보고하고 프로그램을 중단시키거나, 더 이상의 잘못된 메모리 접근을 방지합니다.

5. Shadow Memory의 1:16 비율

ASan은 메모리 공간을 16배 축소하여 shadow memory를 사용합니다. 즉, 실제 메모리의 1바이트에 대해 shadow memory는 16바이트를 사용하지 않으며, 효율적으로 오류를 감지할 수 있도록 설계되었습니다.

왜 16배 축소를 사용할까?

   - 성능 최적화: 실제 메모리보다 작은 shadow memory를 사용함으로써, 메모리 오버헤드를 줄이고 성능에 미치는 영향을 최소화할 수 있습니다.

   - 효율적인 검사: 메모리의 각 바이트를 직접 검사를 하지 않고, shadow memory에서 한 번의 간단한 값 검사를 통해 오류를 추적할 수 있습니다.

6. 메모리 검사의 동작 방식

ASan이 메모리 오류를 탐지하는 과정은 다음과 같습니다:

  1. 메모리 접근 시: 프로그램이 메모리 읽기/쓰기 작업을 할 때마다, ASan은 해당 메모리 주소의 shadow memory에 기록된 값을 확인합니다.
  2. 검사 및 비교: 실제 메모리 주소에 대한 접근이 valid한지, 또는 잘못된 접근인지 검사합니다.
  3. 오류 발견 시: 만약 메모리 오류가 발견되면, ASan은 오류를 보고하고, 프로그램을 종료시키거나 경고 메시지를 출력하여 디버깅을 돕습니다.

 

'지식 > Linux' 카테고리의 다른 글

shell script - := 와 :- 의 차이  (0) 2025.12.30
shell script - NAME=${1:-"DEFAULT"}  (0) 2025.12.30
Samba 설정  (1) 2023.12.03
Raspberry Pi - 디지털 액자 만들기  (0) 2023.06.10
Raspberry Pi - 디지털 액자 (Dynaframe)  (0) 2023.06.10

댓글