# BoundsSanitizer

## BoundsSanitizer 란?

BoundsSanitizer(BoundSan)는 바이너리에 계측을 추가하여 배열 액세스에 관한 범위 검사를 삽입합니다. 이러한 검사는 비교 검사가 가능하도록 배열 크기가 런타임 시에 알려지며 컴파일러가 컴파일 시간에 액세스가 안전할 것임을 증명할 수 없는 경우에 추가됩니다. Android 10은 블루투스 및 코덱에서 BoundSan을 배포합니다. BoundSan은 컴파일러에 의해 제공되며 플랫폼 곳곳의 다양한 구성요소에서 기본으로 사용 설정됩니다.

## 구현 <a href="#implementation" id="implementation"></a>

BoundSan은 [UBSan의](https://source.android.com/devices/tech/debug/sanitizers?hl=ko#undefinedbehaviorsanitizer) 바운드 새니타이저를 사용합니다. 이 완화는 모듈별 수준에서 사용 설정됩니다. 이는 Android의 중요 구성요소를 안전하게 유지할 수 있게 도와주며 사용 중지하면 안 됩니다.

추가 구성요소에는 BoundSan을 사용 설정하는 것이 좋습니다. 이상적인 후보는 권한이 있는 네이티브 코드나 신뢰할 수 없는 사용자 입력을 파싱하는 복합 네이티브 코드입니다. BoundSan 사용 설정과 관련된 성능 오버헤드는 안전한 것으로 증명할 수 없는 배열 액세스 수에 종속됩니다. 평균적으로 약간의 오버헤드 비율을 예상해야 하며, 성능에 대한 우려가 있는 경우 테스트하세요.

### 청사진 파일에 BoundSan 사용 설정 <a href="#blueprint-files" id="blueprint-files"></a>

BoundSan을 청사진 파일에 사용 설정하려면 바이너리 및 라이브러리 모듈의 `misc_undefined` sanitize 속성에 `"bounds"`를 추가해야 합니다.

```
sanitize: {
   misc_undefined: ["bounds"],
   diag: {
      misc_undefined: ["bounds"],
   },
   blacklist: "modulename_blacklist.txt",
```

### **diag**

`diag` 속성은 새니타이저에 진단 모드를 사용 설정합니다. 테스트 중에만 진단 모드를 사용합니다. 진단 모드는 완화의 보안 이점을 무색하게 하고 더 높은 성능 오버헤드를 수반하는 오버플로에 대해 취소되지 않으므로 프로덕션 빌드에 사용하지 않는 것이 좋습니다.

### **blacklist**

`blacklist` 속성은 개발자가 사용 가능한 차단 파일을 지정하여 함수 및 소스 파일이 처리되지 않도록 합니다. 성능에 대한 우려가 있고 타겟팅된 파일/함수의 기여가 상당한 경우에만 이 속성을 사용하세요. 배열 액세스가 안전한지 확인하려면 이러한 파일/함수를 수동으로 감사하세요. 자세한 내용은 [문제해결](https://source.android.com/docs/security/test/bounds-sanitizer?hl=ko#troubleshooting)을 참조하세요.

### makefile에 BoundSan 사용 설정 <a href="#makefiles" id="makefiles"></a>

BoundSan을 makefile에 사용 설정하려면 `"bounds"`를 바이너리 및 라이브러리 모듈의 `LOCAL_SANITIZE` 변수에 추가해야 합니다.

```
LOCAL_SANITIZE := bounds
# Optional features
LOCAL_SANITIZE_DIAG := bounds
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
```

`LOCAL_SANITIZE`는 쉼표로 구분된 새니타이저 목록을 허용합니다.

`LOCAL_SANITIZE_DIAG`는 진단 모드를 켭니다. 테스트 중에만 진단 모드를 사용합니다. 진단 모드는 완화의 보안 이점을 무색하게 하고 더 높은 성능 오버헤드를 수반하는 오버플로에 대해 취소되지 않으므로 프로덕션 빌드에 사용하지 않는 것이 좋습니다.

`LOCAL_SANITIZE_BLACKLIST`는 개발자가 사용 가능한 차단 파일을 지정하여 함수 및 소스 파일이 처리되지 않도록 합니다. 성능에 대한 우려가 있고 타겟팅된 파일/함수의 기여가 상당한 경우에만 이 속성을 사용하세요. 배열 액세스가 안전한지 확인하려면 이러한 파일/함수를 수동으로 감사하세요. 자세한 내용은 [문제해결](https://source.android.com/docs/security/test/bounds-sanitizer?hl=ko#troubleshooting)을 참조하세요.

### BoundSan 사용 중지 <a href="#disabling-boundsan" id="disabling-boundsan"></a>

차단 또는 함수 속성으로 함수 및 소스 파일에서 BoundSan을 사용 중지할 수 있습니다. BoundSan은 사용 설정 상태를 유지하는 것이 좋으므로 함수나 파일이 대량의 성능 오버헤드를 생성하고 소스가 수동으로 검토된 경우에만 사용 중지하세요.

[함수 속성](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#disabling-instrumentation-with-attribute-no-sanitize-undefined) 및 [차단 파일 형식](https://clang.llvm.org/docs/SanitizerSpecialCaseList.html)으로 BoundSan을 사용 중지하는 자세한 방법은 Clang LLVM [문서](https://clang.llvm.org/docs/)를 참고하세요. 다른 새니타이저가 영향을 받지 않도록 하려면 타겟 새니타이저를 지정하는 섹션 이름을 사용하여 차단 범위를 특정 새니타이저로 한정하세요.

## 유효성 검사 <a href="#validation" id="validation"></a>

BoundSan 전용 CTS 테스트는 없습니다. 대신 CTS 테스트가 BoundSan 사용 여부와 상관없이 통과되도록 하여 기기에 대한 영향이 없는지 확인하세요.

## 문제해결 <a href="#troubleshooting" id="troubleshooting"></a>

BoundSan을 사용 설정한 후에는 구성요소를 꼼꼼히 테스트하여 이전에 감지되지 않은 모든 범위 밖의 액세스가 해결되었는지 확인하세요.

BoundSan 오류는 다음과 같은 Tombstone 취소 메시지를 포함하므로 쉽게 식별 가능합니다.

```
pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: out-of-bounds'
```

진단 모드에서 실행할 때는 소스 파일, 행 번호 및 색인 값이 `logcat`에 출력됩니다. 기본적으로 이 모드는 취소 메시지가 발생하지 않습니다. `logcat`을 검토하여 오류가 없는지 확인하세요.

```
external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'
```

## 출처 : [바로가기 ](https://source.android.com/)

{% embed url="<https://doc.skill.or.kr>" %}
NHN Cloud 정보 사이트&#x20;
{% endembed %}

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트
{% endembed %}
