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은 이 접근을 감지하기 위해 다음을 수행합니다:
- p가 가리키는 메모리 영역의 shadow memory를 검사하여 올바르게 할당된 영역인지 확인합니다.
- p[15]는 실제 메모리의 범위를 벗어난 접근이므로, shadow memory에서 해당 주소를 조회할 때 유효하지 않거나 잘못된 상태가 보고됩니다.
- ASan은 즉시 오류를 보고하고 프로그램을 중단시키거나, 더 이상의 잘못된 메모리 접근을 방지합니다.
5. Shadow Memory의 1:16 비율
ASan은 메모리 공간을 16배 축소하여 shadow memory를 사용합니다. 즉, 실제 메모리의 1바이트에 대해 shadow memory는 16바이트를 사용하지 않으며, 효율적으로 오류를 감지할 수 있도록 설계되었습니다.
왜 16배 축소를 사용할까?
- 성능 최적화: 실제 메모리보다 작은 shadow memory를 사용함으로써, 메모리 오버헤드를 줄이고 성능에 미치는 영향을 최소화할 수 있습니다.
- 효율적인 검사: 메모리의 각 바이트를 직접 검사를 하지 않고, shadow memory에서 한 번의 간단한 값 검사를 통해 오류를 추적할 수 있습니다.
6. 메모리 검사의 동작 방식
ASan이 메모리 오류를 탐지하는 과정은 다음과 같습니다:
- 메모리 접근 시: 프로그램이 메모리 읽기/쓰기 작업을 할 때마다, ASan은 해당 메모리 주소의 shadow memory에 기록된 값을 확인합니다.
- 검사 및 비교: 실제 메모리 주소에 대한 접근이 valid한지, 또는 잘못된 접근인지 검사합니다.
- 오류 발견 시: 만약 메모리 오류가 발견되면, 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 |
댓글