Thursday, September 21, 2023

CVE-2021-25337 (Android)

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

취약점 공격 과정

  1. 삼성의 Clipboard에 insert() 메소드에 액세스 제어 취약점을 활용하여 시스템 서버 권한을 획득하고 data 및 system 파일 경로에 접근한다.

SELinux system server Context에서 시스템 사용자가 실행하는 삼성의 시스템 서버 내부에는 Clipboard 및 wifi, Timezone dectector 서비스 등이 있다. 시스템 서버에서 실행되는 Clipboard Content Provider는 com.android.server.semclipboard.SemClipboardProviderClass에서 확인할 수 있다.

해당 클래스의 변수는 아래와 같다. 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.SemClipboardProviderinsert()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를 생성한다. 그리고 openFileDescriptorOpenFile을 호출하고 최종적으로 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();
  1. 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

List

MobSF

MobSF는 오픈소스 모바일 앱 자동 보안 진단 프레임워크로 자동 분석 시스템 구축할 때 사용한다. 정정 및 동적 분석이 가능하며, Android, iOS, Windows에 대해 침투 테스트, 멀웨어 분석 및 보안 평가를 할 수 있다. 참고자료 필...