 Специалист по безопасности Гвидо Вранкен (Guido Vranken) своим фаззером нашёл четыре серьёзные уязвимости в безопасности OpenVPN. Что интересно, это произошло после недавно проведённых двух полных аудитов безопасности исходного кода этой программы. Это наталкивает на мысль, что аудит исходников не даёт абсолютной гарантии отсутствия багов.
Специалист по безопасности Гвидо Вранкен (Guido Vranken) своим фаззером нашёл четыре серьёзные уязвимости в безопасности OpenVPN. Что интересно, это произошло после недавно проведённых двух полных аудитов безопасности исходного кода этой программы. Это наталкивает на мысль, что аудит исходников не даёт абсолютной гарантии отсутствия багов. Сам Гвидо Вранкен считает, что в некоторых случаях человеческий аудит — вообще не лучший вариант. Он говорит, что спонсорам аудита OpenVPN (деньги собирали через краудфандинг) не следовало оплачивать ручной аудит, а надо было нанять экспертов, которые будут заинтересованы в нахождении уязвимостей любыми средствами (через тот же фаззинг). Такая стратегия принесла бы наибольшие дивиденды. По крайней мере, сейчас мы видим, что фаззинг оказался эффективнее, чем анализ вручную.
OpenVPN — свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом для создания зашифрованных каналов между ПК. Создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL.
Уже выпущены патчи для OpenVPN. Следуется обновиться до версий 2.4.3 и 2.3.17 как можно скорее, чтобы чувствовать себя в безопасности. Всё-таки дыры, найденные Гвидо, действительно очень серьёзные.
Гвидо Вранкен говорит, что в данном случае автоматический анализ оказался эффективнее, чем труд оплаченных аудиторов, так что в будущем стоит подумать, на что тратить бюджет. Согласно его сценарию, идеальный аудит должен начинаться с фаззинга, и только после автоматического анализа кода его должны анализировать эксперты.
Да, эксперты способны найти уязвимости там, где фаззинг неэффективен. Например, люди могут проверить криптографические операции и процедуры, проверить логику уровня приложения, оценить зависимости от определённых версий библлиотек, оценить вероятность утечек персональной информации через разные сторонние каналы и прочими способами проявить свою экспертизу. Но заставлять людей искать те же ошибки памяти — совершенно нерациональное расходование ресурсов, считает Гвидо. Такое гораздо быстрее и эффективнее делается автоматическими средствами.
Уязвимости
CVE-2017-7521
В функции
extract_x509_extension() в файле ssl_verify_openssl.c обнаружено сразу несколько ошибок, в том числе некорректная процедура освобождения памяти и некорректное использование структуры GENERAL_NAMES. GENERAL_NAMES *extensions;
int nid = OBJ_txt2nid(fieldname);
 
extensions = (GENERAL_NAMES *)X509_get_ext_d2i(cert, nid, NULL, NULL);Гвидо Вранкен пишет, что из-за такой реализации различные NID требуют разных структур хранения. То есть использование структуры
GENERAL_NAMES для каждого NID приведёт к эффектным падениям для некоторых NID.Соответственно, эта уязвимость классифицируется как удалённый сбой сервера / утечки памяти / двойное освобождение памяти (double-free, один и тот же участок памяти освобождается дважды).
CVE-2017-7520
Удалённый сбой клиента (включая MiTM), утечка данных.
Эта уязвимость угрожает только тем, кто использует OpenVPN для подключения к прокси NTLM version 2.
В файле
ntlm_phase_3() in ntlm.c обнаружен следующий код:if (( *((long *)&buf2[0x14]) & 0x00800000) == 0x00800000)          /* Check for Target Information block */
{
    tib_len = buf2[0x28];            /* Get Target Information block size */
    if (tib_len > 96)
    {
        tib_len = 96;
    }
    {
        char *tib_ptr = buf2 + buf2[0x2c];           /* Get Target Information block pointer */
        memcpy(&ntlmv2_blob[0x1c], tib_ptr, tib_len);           /* Copy Target Information block into the blob */
    }
}Массив
buf2 здесь содержит данные, полученные пиром (прокси). Фаззинг показал несколько багов. Во-первых, если
buf[0x28] содержит значение 0х80 или больше, то tib_len станет отрицательным, что порушит memcpy. Во-вторых, buf[0x2c] используется как индекс для массива buf2. Если оно примет значение 0х80 или больше, то tib_len опять станет отрицательным и в данном случае будет указывать перед buf2, что приведёт к утечке данных. Память с этого адреса затем копируется в ntlmv2_blob, которым потом отправляется пиру. Налицо утечка данных и потенциальная возможность для атаки MiTM. Пароль пользователя, кстати, тоже хранится в стеке, и тоже будет отправлен пиру чистым текстом. Такая атака может быть спровоцирована злоумышленником в дистанционном режиме.Повреждение буфера стека у клиента и MITM (нет CVE)
Такой вариант атаки крайне малореалистичен, для него требуется сочетание ряда условий, в том числе пользователь должен выбрать имя пользователя, которое заканчивается на обратный слэш, и должен использоваться NTLM version 2.
CVE-2017-7508
Уязвимость позволяет осуществить удалённое обрушение сервера, на котором работает OpenVPN, если злоумышленник пошлёт на него специальным образом составленные данные.
Дело в том, что функция
mss_fixup_dowork() в файле mss.c содержит следующий код:ASSERT(BLEN(buf) >= (int) sizeof(struct openvpn_tcphdr));Гвидо Вранкен пишет, что существует возможность сконструировать такой пакет для сервера, чтобы указанное утверждение не выполнялось, и сервер остановится.
CVE-2017-7522
Атака с обрушением сервера mbed TLS/PolarSSL для своего успешного проведения требует, чтобы на сервере была установлена опция конфигурации
–x509-track. Уязвимости подвержена OpenVPN 2.4 (не 2.3), скомпилированная с криптографическим бэкендом mbed TLS/PolarSSL.Был найден ещё один баг (нет CVE) с переполнением буфера стека в случае исключительно длинной опции
–tls-cipher, но это не классифицировали как реальную уязвимость, потому что эксплуатация возможна только при условии ненадёжных настроек, а тогда атака доступна и по другим каналам.Для поиска уязвимостей Вранкен использовал фаззер libFuzzer вместе с AddressSanitizer (ASAN), UndefinedBehaviorSanitizer (UBSAN) и MemorySanitizer (MSAN).
Комментарии (40)
 - Dmitri-D23.06.2017 06:17- Уязвимости так и будут появляться пока программы разрабатываются как произведения искуства, или творчества, если угодно.  - SystemXFiles23.06.2017 06:33- Это как? Связи уловить не могу.  - hokum1323.06.2017 09:20- Речь, наверное, про то, что очень большая часть программистов самоучки-быдлокодеры, которые, например, на java пишут в процедурном стиле. 
 Правда сомнительно, чтобы в столь сложных проектах, как openvpn, мог разобраться и что-то дельное написать откровенный быдлокодер.
 PS: Оскорбить ни кого не хочу. Просто факт: пока технология развивается — научного подхода ждать не стоит. Когда-нибудь IT это перерастет. Но пока это нормально.- maxpsyhos23.06.2017 11:40+1- Никогда IT это не перерастёт. Научный подход в программировании и так есть, с него, собственно, всё и началось. Он даже не сильно более требователен к качеству персонала. Но его проблема в том, что он требует просто астрономических трудозатрат, которые себя банально не окупают.  - hokum1323.06.2017 15:15- Ну перестали же врачи резать на удачу. Изучили/изобрели наркоз, антисептику и асептику, рентген… Чем мы хуже? 
 Просто постепенно будет написан почти весь код, который нужен миру и пространством для работы программистов останется только рефакторинг и оптимизация под частные задачи. Оптимизация мало сказывается на безопасности (не выгодно ломать код, который ни где не повторяется), а для рефакторинга нужно не только язык понимать, но и понимать что-то в теории программирования.- Hellsy2224.06.2017 07:39- Ну перестали же врачи резать на удачу Через несколько тысяч лет после зарождения медицины…
 
 И количество врачебных ошибок все еще велико. Антисептика работает не всегда, от наркоза просыпаются не все, а трактовка мутных рентгеновских снимков — зачастую искусство.
 
 У нас тоже, в общем-то есть аналогичные инструменты. Вместо антисептики — защитное программирование, вместо наркоза — сэндбоксы, а вместо рентгена вот фаззинг, например.
 
 
 
  - tikhenko26.06.2017 11:00+1- Мне это напомнило мысли отсюда: 
 - … у большинства программистов не сформировано структурное отношение к программе (здесь слово «структурное» употребляем без прямой связи со структурным программированием, а в общем смысле). Программа для них — это нечто сродни литературному тексту, который пишет программист-«писатель», пытаясь описать требующиеся от машины действия. Более того, в таком отношении присутствует даже некая «художественная трепетность». 
 
 Вывод: восприятие программы как инженерной системы, составленной из конструкций, которые соединяются по определённым правилам, не сформировано у массовых программистов, и это представляет реальную проблему для развития ИТ как инженерной деятельности. Обязательное требование к инженерной деятельности — наличие строгих (обычно математизированных) методов, позволяющих анализировать и гарантировать свойства создаваемых конструкций, выводя их из свойств использованных элементов и соединений.- Hellsy2226.06.2017 12:09- Жаль только, что этот вывод этот взят автором с потолка. А его «безусловно было продемонстрировано» на той же странице — попытка перейти от частного случая к общему выводу, причем путем радикального ухудшения читаемости кода. - mayorovp26.06.2017 12:23- Ну, я бы не сказал что качество кода радикально ухудшилось. Хотя и сильно лучше тоже не стало. 
 
 
 
 
 - Scf23.06.2017 08:13- > Следуется обновиться до версий 2.4.3 и 2.3.17 
 
 У меня убунта, обновился:
 
 - root@42116f182a1c:/# openvpn --version 
 OpenVPN 2.3.2 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Jun 22 2017
 
 
 Версия значительно старше, но дата сборки — вчерашняя. Уязвима она или нет?- izzholtik23.06.2017 11:23- Обновлялся вчера вечером, сейчас 2.3.11 
 а какая у вас версия убунты? - myemuk26.06.2017 07:44+1- Всегда сижу только на lts. Сейчас на 16.04, а на 18.04 перейду только осенью 18го. Пусть обкатают ее маленько перед переходом. Все-таки стабильность сейчас для меня важней всяких плюшек и новшевств. 
 
  - nexion24.06.2017 20:01+1- Для Debian/Ubuntu проект OpenVPN поддерживает собственный репозиторий: https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos (только i386 и amd64) со свежими сборками. 
 Вчера на #openvpn-devel как раз шутили по этому поводу насчёт debian и recent в одном предложении:- Kind | another good thing about what happened, I haven't previously noticed you guys run a debian repository with recent builds @cron2 | he said "debian" and "recent" in the same sentence... CRCinAU | recent in debian terms is about 4 weeks from something being EOL'ed @ecrist | and by 4 weeks from you mean 4 weeks after it's been EOL'd.
 - (так и не понял, как тут сделать блок текста моноширинным шрифтом и без подсветки) - a5b26.06.2017 02:52- Если "dpkg -l openvpn" вернет 2.3.2-7ubuntu3.2 (для 14.04) — то с исправлениями (версия от 22 июня 2017): 
 https://packages.ubuntu.com/trusty/amd64/openvpn -> Ubuntu Changelog
 http://changelogs.ubuntu.com/changelogs/pool/main/o/openvpn/openvpn_2.3.2-7ubuntu3.2/changelog
 openvpn (2.3.2-7ubuntu3.2) trusty-security; urgency=medium
 - SECURITY UPDATE x 7… — Marc Deslauriers marc.deslauriers@ubuntu.com Thu, 22 Jun 2017 10:51:34 -0400
 
 - Xenial 16.04: https://packages.ubuntu.com/xenial/amd64/openvpn — 2.3.10-1ubuntu2.1 
 yakkety 16.10: https://packages.ubuntu.com/yakkety/amd64/openvpn — openvpn 2.3.11-1ubuntu2.1
 zesty 17.04: https://packages.ubuntu.com/zesty/amd64/openvpn — openvpn (2.4.0-4ubuntu1.3)
  - ars_ivanov23.06.2017 08:44- Вот зачем выкладывать это после того как только-только (позавчера) релиз с заплаткой вышел. В репах пока ничего нет. Придется самому собирать. 
  - ChiefPilot23.06.2017 10:59+2- А как узнать, проверяли ли его при помощи PVS-Studio?  - imanushin23.06.2017 11:42+1- Дружелюбно попросить сотрудников компании (например, Andrey2008, foto_shooter, AsyaRak, SvyatoslavMC) ответить, если им не сложно.  - ChiefPilot23.06.2017 12:53- Спасибо! Отправил сообщения двум сотрудникам из списка: Andrey2008 и SvyatoslavMC (остальные двое read-only — наверное нет смысла к ним обращаться?).  - Andrey200823.06.2017 13:59+1- Мы не проверяли проект OpenVPN. Проверял ли его кто-то ещё, я не знаю, но думаю, что нет. 
 
 Найдем ли мы такие ошибки? Не знаю, надо пробовать, но сомневаюсь. Надо понимать, что ранее мы не ориентировались в направлении поиска уязвимостей и только в последние месяцы начали смотреть в эту сторону. Там есть некоторая специфика, которой мы будем учить анализатор.
 
 Сейчас PVS-Studio круто ищет ошибки. Некоторые из них по совместительству являются уязвимостями. Буквально на днях, мой коллега продемонстрировал, что некоторые из уязвимостей могли бы быть найдены с помощью PVS-Studio, если бы его кто-то запустил :). Он взял некоторые проекты (старые версии исходников) и убедился, что уязвимости находятся. Вот эта заметка: "Как PVS-Studio может помочь в поиске уязвимостей?".
 
  - SvyatoslavMC23.06.2017 13:48+1- Ну что Вам ответить?) Я проверю неисправленные исходники, посмотрим с коллегами несколько найденных CWE, кое-что может совпадёт с материалом этой статью. Диагностики PVS-Studio действительно покрывают очень много серьёзных CWE (но не все, многое из оригинального списка не относится к C/C++/C#, также очень много неадекватных правил, на мой взгляд). 
 
 Далее идёт работа по эксплуатации уязвимости и приведении её к CVE, для чего нужен соответствующий опыт. Найдя код:
 
 - ASSERT(BLEN(buf) >= (int) sizeof(struct openvpn_tcphdr));
 
 вряд ли я написал бы в статьи что-то типа
 - … существует возможность сконструировать такой пакет для сервера, чтобы указанное утверждение не выполнялось, и сервер остановится. 
 Мы пробуем сейчас сотрудничать со специалистами по безопасности, которые смогут выявлять уязвимости на основе найденных CWE с помощью PVS-Studio.
 
 
  - saboteur_kiev23.06.2017 12:25- Можно даже самостоятельно взять открытый код и прогнать в PVS-Studio, и даже написать об этом на Хабр. 
 В этом и суть опен-сорса.
 
  - amarao23.06.2017 16:05+3- Не надо путать ручной аудит и фаззеры. Ручной аудит проверяет, что нет закладок. Фаззер пытается программу уронить. Можно иметь хорошо написанную программу с бэкдором, которой фаззер будет полностью доволен. И можно иметь честно написанную программу без бэкдоров, в которой фаззер будет ловить баги. 
 
 Фаззер хорошо, FUD в статье — нет.
 
 
 
           
 

DrPass
Куда больше нелепым кажется, что кто-то где-то вообще считал, что аудит исходников может дать абсолютную гарантию чего-либо.
pronvit
Ну как же, это один из основных постулатов open-source — открытый код безопаснее, потому что каждый может изучить.
monah_tuk
Всё зависит от пристальности изучения, личных навыков изучающего, количества изучающих и везения. Для тёмных целей это тоже верно. В любом случае, наличие открытых исходников даёт больше шансов большему числу людей их изучить. Для того же фазинга исходники тоже необходимы.
Смогут они найти что-то или нет — другой вопрос. Я, в некоторых проектах (или частях одного крупного), бывает сразу и о основную логику вникнуть не могу, требует времени. Что говорить о нештатной эксплуатации.
Hellsy22
Безопаснее переходить дорогу за зеленый свет по пешеходному переходу солнечным днем, чем перебегать где попало в темной одежде ночью. Но абсолютной гарантии успеха даже первый вариант не дает.
myemuk
Может и каждый, но вот кто это действительно делает? Вспомните историю с Heartbleed.
saboteur_kiev
Вопрос в том, как был найден HeartBleed? Не благодаря ли тому, что код открытый?
Да, найдено поздно, но найдено. А сколько есть уязвимостей в проприетарных системах, можно и после взлома не узнать.
DrPass
Неа. Это как раз хороший пример, который показывает, что и открытый код в большинстве случаев никто, кроме тех, кто непосредственно занимается его разработкой и сопровождением, не анализирует и не выверяет.
Будь код OpenSSL закрытым, ну нашел бы этот баг через те же несколько лет кто-то из внутренних разработчиков, только и всего.
Radmin
Или не нашёл бы…
Или нашёл бы, и не стал ничего с ним делать по договорённости со спецслужбами...
DrPass
Ну так и с открытым абсолютно то же самое. Мы-то судим об одной уязвимости, которую нашли, при этом понятия не имеем, сколько их там ещё может быть. Так, чисто по статистике, какого-то преимущества по надёжности или безопасности у проприетарного или опенсурсного ПО не наблюдается. Т.е. сказать, что какая-то модель надёжнее, нельзя. Просто в проприетарном, если что, всегда можно ткнуть пальцем на конкретную организацию и сказать: «Это они виноваты». А в опенсурсе так не получится.
Hellsy22
Корректнее сказать, что мы не можем знать точно, сколько их там еще может быть. Но конечно же мы можем сделать оценку, исходя из прошлого опыта.
А вот такие утверждения нуждаются в доказательстве. Приведите, пожалуйста, статистику.
navion
NSA точно делает.
alexevil
Ну да, он безопаснее — но это не значит, что он абсолютно безопасен.
saboteur_kiev
Открытый код не безопаснее, а «потенциально безопаснее».
То есть у каждого желающего есть потенциальная возможность анализировать код и искать в нем проблемы — не обязательно даже сидеть самому смотреть, или нанимать экспертов — можно хотя-бы по-быстрому прогнать исходники через анализатор и получить дополнительные данные о качестве кода.