Thu, Imchecker Group, свяжитесь с нами по адресу [email protected]
Библиотеки предлагают многократные функциональные возможности через интерфейсы прикладного программирования (API) с ограничениями использования, такими как условия вызовов или заказы. Нарушения ограничения, т. Е. Происедания API, обычно приводят к ошибкам и проблемам безопасности. Хотя в последние несколько десятилетий исследователи разработали различные детекторы API-Misuse, недавние исследования показывают, что злоупотребление API распространено в реальных проектах. Существующие подходы либо страдают от разреженной проблемы использования (то есть ошибки, которые редко встречаются), либо сообщают о ложных тревогах из -за неточной семантики. Чтобы преодолеть эти ограничения, мы представляем Imchecker для эффективного обнаружения ошибок API-Misuse. Ключевым пониманием Imchecker является метод статического анализа, направленный на ограничение, основанный на языке, специфичном для домена (DSL) для определения ограничений использования API. Изучая реальные ошибки API-Misuse, мы предлагаем IMSPEC DSL, который охватывает большинство типов ограничений использования API и обеспечивает простую, но точную спецификацию. Кроме того, мы разрабатываем и реализуем Imchecker для автоматического разбора IMSPEC в проверку целей и используем статический двигатель анализа для выявления потенциальных ошибок API и обрезки ложных срабатываний с богатой семантикой. Мы создали экземпляр Imchecker для программ C и оцениваем его на широко используемых критериях и крупномасштабных программах реального мира.
В настоящее время было найдено 75 ранее неизвестных ошибок, и 61 было подтверждено и зафиксировано в ядре Linux, OpenSSL и пакетах в Ubuntu 16.04. Мы стараемся применить Imchecker к большему количеству программ. Мы загружаем детали в evaluation_data/new_bugs
Наша исследовательская рукопись и рукопись инструмента находятся в процессе рассмотрения ICSE'19. Мы загрузим их, как только закончит процесс обзора. (Ну, вы можете написать нам, чтобы получить доступ к ним только с помощью академической цели.)
Наше демонстрационное видео инструмента доступно на английском языке версии: https://youtu.be/ygdxeyoevim Китайская версия: https://www.youtube.com/watch?v=3zaneGtwuto https://pan.baidu.com/s/1digq0r6wk5shhmlotk9kbg
Использование наших инструментов на инструментах/readme.md
Imchecker все еще находится в стадии разработки и содержит много ошибок и списков Todo. Любые ошибки или запросы на функции, не стесняйтесь написать нам по электронной почте по адресу [email protected] или открытые проблемы.
Чтобы лучше понять, какой тип ошибок API-Misuse встречается в реальных проектах C и как разработчики фиксируют их на практике, мы вручную изучали два года истории версий трех проектов с открытым исходным кодом и половину года Linux-Kernel в 2017 году, как показано в следующей таблице. Эти истории выбираются из -за продолжающегося развития и потому, что они часто упоминаются в различных работах по обнаружению ошибок. В общей сложности мы изучили около 13,57 млн. Лок и 51,1K Commits.
| Проект | Лок | Изученный период | Всего коммитов | Исправления ошибок | API неправильные употребления |
|---|---|---|---|---|---|
| Загрязнение | 112,8K | 20160101-20171231 | 2613 | 135 | 38 |
| Gnutls | 35,8K | 20160101-20171231 | 2769 | 86 | 30 |
| Openssl | 454,2K | 20160101-20171231 | 6487 | 344 | 115 |
| Linux | 12,96 м | 20170701-20171231 | 39295 | 995 | 362 |
| Общий | 15,57 м | Два года | 51.1k | 1560 | 509 |
Чтобы помочь читателям извлечь сообщение Commits, изменив файлы и исправления файлов, мы открываем наш инструмент Gitgrabber . Мы также загружаем все коммиты, связанные с ошибками API-Misuse по изучаемым субъектам для дальнейшего использования.
Читатели могут найти их в папке empirical_study. Любые проблемы на Gitgrabber, пожалуйста, не стесняйтесь обращаться к нам!
Мы выбираем широко используемый эталон, IE, Juliet Test Suite V1.3 и две реальные программы в своих последних версиях: Linux Kernel-4.18-RC4, выпущенный на 2018-7-9 и OpenSSL-1-1-1-PRE8, выпущенный на 2018-6-20, чтобы оценить наш подход. Мы оцениваем наш подход с двух точек зрения.
Мы также проверяем эти случаи на Apisan A API-инструмент обнаружения использования API с помощью семантической перекрестной проверки и Clang-SA, инструмента статического анализа с открытым исходным кодом.
Мы загружаем API-Misuse-Benchmark и оригинальные результаты на evaluation_data.
Основной мотивацией Imchecker является обнаружение ошибок API-Misuse в реальных программах, а именно, чтобы определить, может ли Imchecker найти ранее неизвестные ошибки. Поэтому мы применяем Imchecker к последним версиям двух известных программ с открытым исходным кодом: Linux Kernel-4.18-RC4 и OpenSSL-1-1-1-1-PRE8 и пакеты в Ubuntu 16.04. Целевые API отбираются из неправильных используемых из эмпирического исследования.
До сих пор было найдено 56 ранее неизвестных ошибок, и 36 были подтверждены разработчиками.
| Проект | Ошибки (ответ ожидания/подтвержден/исправлен) |
|---|---|
| Openssl | 17 (5/5/12) |
| Linux | 30 (20/20/5) |
| DMA | 1 (0/0/1) |
| эмик | 2 (0/0/2) |
| hexchat | 2 (1/1/0) |
| httping | 1 (0/1/0) |
| ipmitool | 1 (0/1/0) |
| Open-VM-инструменты | 2 (0/0/2) |
| IRSSI | 2 (1/1/0) |
| Keepalive | 2 (0/0/2) |
| THC-IPV6 | 2 (0/0/2) |
| Freeradius-Server | 2 (0/0/2) |
| Trafficserver | 3 (3/0/0) |
| Тинк | 2 (0/0/2) |
| Sslplit | 2 (0/0/2) |
| rdesktop | 2 (2/0/0) |
| Прокситуннель | 2 (2/0/0) |
| Общий | 75 (16/29/32) |
Мы загружаем детали в evaluation_data/new_bugs
Было показано, что поведенческие спецификации, описывающие ограничения использования API, являются полезными для разработчиков для эффективного использования API, а также для решения проблемы использования редкой использования, обеспечивая проверку использования целевых API. Например, Бодден представляет Крисл, чтобы преодолеть когнитивный разрыв между экспертами по криптографии и разработчиками. Тем не менее, текущие языки спецификации либо предназначены для полных свойств программы, таких как BLAST, JML, либо слишком специфичны для применения к общему обнаружению API-USAGE, таким как SLIC. Мы вводим легкий язык, специфичный для домена для ограничений использования API с именем IMSPEC. IMSPEC одновременно гарантирует, что целевые API -интерфейсы подтверждаются, даже при немногие использование, и направляет обнаружение неправильного использования. Экземпляр IMSPEC-это шаблон, заполненный набором ограничений для правильного использования API, и любое нарушение приведет к ошибке Misusise API.
Мы загружаем экземпляры imspec в папку Impsec, мы постепенно обновим эту папку для большего количества API. Кроме того, IMSPEC может использоваться для других целей, таких как генерация случаев тестирования, проверка и так далее. Более того, мы предоставляем писателя GUI Imspec в Tools.
В настоящее время IMSPEC создается ручным написанием. Тем не менее, мы гарантируем, что он может быть создан автоматически из методов добычи спецификаций. Мы изо всех сил стараемся провести эксперименты и реализовать анализаторы, чтобы перевести результаты из инструментов майнинга в IMSPEC, такие как Apex. Но эти инструменты не могут решить все ограничения использования. Мы также хотели бы пригласить разработчиков, чтобы помочь нам уточнить экземпляры IMSPEC, сгенерированные в соответствии с руководством пользователя, таких как OpenSSL.
Правильный Api-Usage должен удовлетворить набор ограничений использования, то есть нарушения ограничений могут привести к ошибкам API-Misuse. Imchecker автоматически обнаруживает эти ошибки в исходном коде, используя спецификации IMSPEC. Чтобы обработать сложные, реальные программы, базовые механизмы Imchecker должны быть масштабируемыми при жертвах минимальной точности. Мы рассказываем подробности дизайна Imchecker, в том числе с ограниченным ограниченным символическим выполнением с методами статического анализа для создания контекста анализа, методологий для обнаружения ошибок API-Misus в контексте анализа и методом фильтрации ложных положительных результатов с использованием семантической информации и статистики использования.
Мы используем мотивирующий пример, чтобы проиллюстрировать рабочий процесс Imchecker. Это ошибка API-Misus в OpenSSL, о которой сообщается в CVE-2015-0288. Проезжая проверка кода ошибки X509_get_pubkey() привела к ошибке с нулевым указателем в строке 4.
1 // Location: crypto/x509/x509_req.c: 70 2 X509_REQ *X509_to_X509_REQ(...){
3 ...
4 pktmp = X509 get pubkey ( x );
5 // missing error code check of pktmp
6 + if ( pktmp == NULL )
7 + goto err ;
8 i = X509_REQ_set_pubkey ( ret , pktmp ); 9 EVP_PKEY_free ( pktmp );
10 ...
11 }
12
13 // Location: /crypto/x509/x509_cmp.c: 390
14 int X509_chain_check_suiteb (...){
15 ...
16 // check error value in usage
17 pk = X509 get pubkey ( x );
18 rv = check_suite_b ( pk , -1 , & tflags );
19 ...
20 }
21 // Location: /crypto/x509/x509_cmp.c: 359
22 static int check_suite_b ( EVP_PKEY * pkey ,...){ 23 ...
24 // ensure pkey not NULL
25 if ( pkey && pkey -> type == EVP PKEY EC )
26 ... // usage of pkey
27 }Вот рабочий процесс Imchecker:

Imchecker принимает ограничения использования исходного кода и API в качестве входного и генерирует отчеты об ошибках с конкретными местоположениями и причинами в качестве вывода. Во-первых, ограничения использования API записаны на легком языке, специфичном для доменов с именем Imspec; Например, «возвращаемое значение x509_get_pubkey () должно быть проверено с помощью NULL» . Используя эти спецификации, Imchecker напрямую подтверждает использование целевого API, что снимает проблему разреженной использования и направляет процесс обнаружения ошибок. Затем мы обнаруживаем ошибки API-Misuse в трех этапах. (1) На фазе-1 контекст анализа создается путем построения графа управления потоком и создания трассов пути программы для каждого целевого API, определенного в спецификациях путем использования недооплаченного символического выполнения с помощью точечного, диапазона и чувствительного к пути анализ. В этом примере генерируются два следа, T1 и T2, как показано в поле выше прохождения программы. Таким образом, Imchecker может успешно захватить контекст использования X509_get_pubkey() , EVP_PKEY_free() и тех, кто между ними. (2) На фазе 2 Imchecker использует следы для обнаружения нарушений ограничений в качестве потенциальных ошибок. Пример пример, экземпляры TwoApi-Misuse of X509_get_pubkey() найдены для пропущенных проверок кода ошибки, помеченных как потенциальные ошибки. (3) На фазе 3 Imchecker улучшает точность обнаружения, используя несколько экземпляров использования и семантической информации. Затем второе неправильное использование отфильтровано для проверки, проведенной в X509_to_X509_REQ() в строке-25.
Использование нашего инструмента можно найти здесь: инструменты/readme.md
При исследовании отчетов об ошибках, сгенерированных Imchecker, мы находим несколько интересных ошибок и получаем полезный опыт в процессе отчетности об ошибках с разработчиками с открытым исходным кодом. Мы делимся нашим следующим опытом.
Авторы хотели бы поблагодарить разработчиков ядра Linux и OpenSSL, чтобы помочь нам уточнить IMSPEC и подтвердить отчеты об ошибках.