Подведены (https://www.zerodayinitiative.com/blog/2019/3/21/pwn2own-van...) итоги второго дня соревнования Pwn2Own 2019, ежегодно проводимого в рамках конференции CanSecWest в Ванкувере. На соревновании были продемонстрированы рабочие техники эксплуатации ранее неизвестных уязвимостей в Firefox, Edge, Safari, VMware Workstation и VirtualBox. Суммарный размер выплат составил 510 тысяч долларов (общий призовой фонд составлял более 2 млн долларов).
Успешно продемонстрированные следующие взломы:- $35 тысяч - взлом VirtualBox: целочисленное переполнение + race condition, позволившие из окружения гостевой системы выполнить код на стороне хост-системы;
- $35 тысяч - взлом VirtualBox: целочисленное переполнение, позволившее получить доступ к базовому системному окружению из гостевой системы;- $40 a тысяч - взлом Firefox: ошибка в JIT + использование логической ошибки для выхода из sandbox-изоляции;
- $50 a тысяч - взлом Firefox: ошибка в JIT + запись за пределы буфера в ядре Windows для выполнения кода с правами ядра;- $45 тысяч - частичный взлом Safari, ошибка в JIT + чтение из области вне буфера с дальнейшей попыткой получения прав root через уязвимость в ядре.
- $50 a тысяч - взлом Microsoft Edge: двойное освобождение блока памяти в процессе отрисовки + выход из sandbox;
- $55 тысяч - взлом Safari с обходом sandbox-изоляции;
- $70 тысяч - взлом VMware Workstation: race condition + переполнение буфера в VMware client, позволившие выполнить код на стороне хост-системы;- $130 a тысяч - взлом Microsoft Edge с последующим выходом из гостевого окружения VMware с выполнением кода на уровне хост-системы.
Взломы ядра Linux и большинства открытых проектов (nginx, OpenSSL, Apache httpd) в этом году исключены из призовых номинаций, а дистрибутив Ubuntu убран из числа окружений для взлома. На завтра запланированы демонстрации взломов информационных систем автомобиля Tesla Model 3 (взлом компонента VCSEC и встроенного браузера на основе Chromium). Общий размер призового фонда на взломы Tesla составляет (https://www.opennet.ru/opennews/art.shtml?num=49956) более 900 тысяч долларов.
URL: https://www.zerodayinitiative.com/blog/2019/3/21/pwn2own-van...
Новость: https://www.opennet.ru/opennews/art.shtml?num=50376
> Взломы ядра Linux и большинства открытых проектов (nginx, OpenSSL, Apache httpd) в этом году исключены из призовых номинацийА это почему? Стесняются? Хотят сделать вид, что проблемы только в коммерческих продуктах?
Нужно платить и за уязвимости в открытых продуктах, так их будут (собственно) показывать публике и исправлять, а не эксплуатировать втихую. А с такой политикой интерес к этому уходит.
>> Взломы ядра Linux и большинства открытых проектов (nginx, OpenSSL, Apache httpd) в этом году исключены из призовых номинаций
> А это почему? Стесняются? Хотят сделать вид, что проблемы только в коммерческих продуктах?
> Нужно платить и за уязвимости в открытых продуктах, так их будут (собственно) показывать публике и исправлять, а не эксплуатировать втихую.Возможно, нет спроса у клиентов главного организатора - Trend Micro, возможно бюджет не позволяет, возможно (хотя конечно вряд ли) им лучше виднее, как тратить свои деньги?
Вот если бы Вы связались и предложили профинансировать, а они бы начали юлить и отказываться …
Дырки там и так находят в большем количестве и латают. Смысл хлеб у людей ядра отнимать?
АНБ деньжат подкинули.
Зачем ломать Edge, если он уже почти Chrome?
Корпоративных слоупоков никто не отменял.
Кoпpoрации должны страдать.
Страдают не корпорации, а простые работники.
Во днища. Вобщем всем досталось!
Блин, ребята. Ладно еще race condition, многопоточность - это очень сложно и трудно воспроизводимо. Но! Целочисленное переполнение. Переполнение буфера. Двойное освобождение. Как нам уже избавиться от этих проклятий? Как в NASA умудряются писать, что 40 лет работают космические аппараты (те же Вояджеры, например)?
c++20, статический анализ, санитейзеры, новые тесты, улучшения компиляторов, постепенное переписывание кода на rust
Rust нас спасёт? Если да, то почему на него льют ушаты критики?
Критику на что угодно льют, не знал? Это нормально.
И особенно на то, что меняет положение дел и заставляет что-то учить или переписывать, даже если в итоге это убирает бардак, устаканивает апи и сообщество выигрывает. См. системд.
Так системд же вносит бардак и сообщество проигрывает, давно доказали. Не?
так аппараты то далеко и не в инете.. и там юзверь 1 - админ. поэтому и не ломает никто.
В том и дело, что далеко. Если у сервака ты можешь в случае чего нажать кнопочку Reset, то там если ошиьочка какая - то уже есть риск вообще потерять корабльХотя, к слову, факапы были у NASA, читал на хабре перевод о том, как они дебажили New Horizons после сбоя, причём было 5 дней на это, а сигнал до аппарата летит 9 часов в одну сторону. Жесть, конечно, не позавидуешь ребятам, но спасли миссию, молодцы!
> Если у сервака ты можешь в случае чего нажать кнопочку ResetНу прилепить реле по триггеру которое будет дергать кнопочку Reset на аппарате не сложно наверное. Например, расположить в основном компутере какой-нибудь модуль вайфай. Если он не отвечает, файлик ОС которая его обслуживает не принимает - включаем на дополнительном устройстве "механическую руку" и жмём кнопочку "Reset".
Т.е. резервирование, дублирование - основные методы борьбы с "багами". Вот и все секреты.
Ну да, там есть обычно резервный бортовой компьютер и всякие watchdog-таймеры. Хотя потерянные корабли были таки
> Целочисленное переполнениеТам не все так просто, простенькая демка:
% cat overflow.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc , char* argv[argc +1]) {
if (argc < 2) return EXIT_FAILURE;
int32_t x = strtol(argv[1], NULL, 10); // это чтобы нам компилятор еще на начальной стадии не соптимизировал все до return 0
while (x > 0) x++;
printf("result %dl\n",x);
return EXIT_SUCCESS;
}
% gcc8 -Wall -Wextra -std=c11 -S -g overflow.c
.L5:
.loc 1 8 20 discriminator 2
addl $1, -4(%rbp)
.L4:
.loc 1 8 11 discriminator 1
cmpl $0, -4(%rbp)
jg .L5
Вроде как все ожидаемо, но:
% gcc8 -Wall -Wextra -std=c11 -g -O2 overflow.c
.L4:
.loc 1 8 19 is_stmt 1 discriminator 2 view .LVU10
.loc 1 8 19 discriminator 2 view .LVU11
.loc 1 8 19 is_stmt 0 discriminator 2 view .LVU12
jmp .L4
Компилятор здорово "оптимизнул" UB (если мне не изменяет память - лезть в спеки сейчас совсем неохота), т.е. без всяких варнингов мы поймали вечный цикл "на ровном" месте.Ну и классическое (не)знание, это ж типа "Дорогая (даже на x86, угу) проверка! Мы точно знаем! Без нее в 100500 раз быстрее" ;)
> Как в NASA умудряются писать, что 40 лет работают космические аппараты (те же Вояджеры,
> например)?Mariner1, Delta 3, Mars Lander, Mars Orbiter :)
Так как пятница, да и самому стало интересно, наовноко^W набросал по быстрому макет:
% gcc8 -Wall -Wextra -std=c11 -g -O3 overflow.c -o overflow
% cat overflow.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc , char* argv[argc +1]) {
if (argc < 3) return EXIT_FAILURE;
int64_t x = strtol(argv[1], NULL, 10);
int64_t y = strtol(argv[2], NULL, 10);
while (x > y) {x += 0xFFFFFFF;}
printf("result %ld\n",x);
return EXIT_SUCCESS;
}% time ./overflow 4 2
result -9223372036586340477
./overflow 4 2 30,27s user 0,01s system 99% cpu 30,295 total
% time ./overflow 4 2
result -9223372036586340477
./overflow 4 2 30,00s user 0,00s system 99% cpu 30,041 total
и
% cat overflow_checked.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc , char* argv[argc +1]) {
if (argc < 3) return EXIT_FAILURE;
int64_t x = strtol(argv[1], NULL, 10);
int64_t y = strtol(argv[2], NULL, 10);
while (x > y) {
if (__builtin_add_overflow(x, 0xFFFFFFF, &x)){
printf("overflow detected %ld\n", x);
break;
}
}
printf("result %ld\n",x);
return EXIT_SUCCESS;
}
% gcc8 -Wall -Wextra -std=c11 -g -O3 overflow_checked.c -o overflow_checked
% time ./overflow_checked 4 2
overflow detected -9223372036586340477
result -9223372036586340477
./overflow_checked 4 2 30,63s user 0,00s system 99% cpu 30,662 total
% time ./overflow_checked 4 2
overflow detected -9223372036586340477
result -9223372036586340477
./overflow_checked 4 2 29,79s user 0,00s system 99% cpu 29,835 total
> Так как пятница, да и самому стало интересноСлушайте, а черкните мне на mike@altlinux.org -- нам нужны такие люди. :)
Люди нужны всем, не все могут себе это позволить.
> Люди нужны всем, не все могут себе это позволить.А Вы почему за него решили, может он позволить или нет? Мне интересно, а что Вы видите плохого в прямых предложениях которое сделал "альтлинуксовец" выше?
Это ваши фантазии, можете ответить сами себе.
> Люди нужны всем, не все могут себе это позволить.А у нас как раз и есть атмосфера, в которой обычно приживаются люди с подобными особенностями характера и поведения. Да, _мы_ можем себе это позволить, плюс ещё и хорошие зарплаты как для продуктовых контор, а не телогрузов.
> с подобными особенностями характератипа тебя? кто тебе заплатил за антипиар?
иди проспись
> if (__builtin_add_overflow(x, 0xFFFFFFF, &x)){Зато портабельно. "Ассемблер никому не нужен" (с) Carry Flag
>> if (__builtin_add_overflow(x, 0xFFFFFFF, &x)){
> Зато портабельно. "Ассемблер никому не нужен" (с) Carry FlagЭ-э … и куда VB уже успели с х86 портировать?
Скорее, исторически сложившиеся костылики и священная корова обратной совместимости.
А сказка о "портабельности" – для всего, что чуть больше привета миру обычно не выдерживает столкновения с реальностью, зато последствия проявляются чуть ли не каждый день …
> А сказка о "портабельности" – для всего, что чуть больше привета миру
> обычно не выдерживает столкновения с реальностью, зато последствия
> проявляются чуть ли не каждый день …Сгущаете краски, судя по e2k (не-x86, не-RISC, да ещё и не-gcc). Не то чтоб "всё не так", но всё-таки далеко не так плохо, по моим наблюдениям до сих пор :-)
В случае e2k есть такое слово "надо", а вот на "x32" как-то не очень портируется с amd64, при том что разница лишь в размере указателей.
На "х86" ассемблере проверка переполнения естественна и производится одной командой. На Сях приходится городить огород (который компилятор ещё должен суметь редуцировать до проверки флага), либо применять интринсик. Похоже, немножко через чур "абстрагировались".
Да, с целочиселкой хороший пример. На хабре, помню, был перевод статьи, которая, кажись, называлась "UB is so undefined" или как-то так, там про это было.И спрашивается, а кто тут виноват? Компилятор, который оптимизирует такое и не предупреждает? Стандарт, который не мог сделать переполнение не-UB? Программист, который посмел надеяться на переполнение?
> while (x > 0) x++;Этот цикл либо вечный, либо не выполняется в соответствии с правилами C/C++.
>> while (x > 0) x++;
> Этот цикл либо вечный,см. выхлоп -S для -O2
> либо не выполняется в соответствии с правилами C/C++.Вообще-то это UB. Причем "вроде работает как задуманно" (т.е. выполняется) для -On, n<2, c -O2 "оптимизируется" в вечный цикл.
"Четкие правила" - это про unsigned:
> A computation involving unsigned operands can never overflowВот другая демка (не мое -- когда-то наткнулся):
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc , char* argv[argc +1]) {
if (argc < 2) return EXIT_FAILURE;
int32_t x = strtol(argv[1], NULL, 16);
int32_t y = x + 1;
if (y < x) {
printf("overflow detected %d\n",x);
} else {
puts("no overflow");
}
return EXIT_SUCCESS;
}
% gcc8 -Wall -Wextra -Woverflow -std=c99 -g -O0 over.c && ./a.out 0x7fffffff [1]
overflow detected 2147483647
% gcc8 -Wall -Wextra -Woverflow -std=c99 -g -O1 over.c && ./a.out 0x7fffffff
no overflow
> Вообще-то это UB. Причем "вроде работает как задуманно" (т.е. выполняется) для -On, n<2, c -O2 "оптимизируется" в вечный цикл.Да, UB, так и есть. Я имел ввиду что цикл вечный в том плане, что по правилам языка переполнение знаковых целых в корректной программе не происходит, а значит компилятор вправе считать, что этот цикл вечный. Т.к. модификация x в этом цикле не приводит к наблюдаемому поведению, его можно попросту исключить и оставить "while (true);".
Что-то я не понял открытий.
Результат следующих строк секрет что-ли был?int32_t i = INT_MAX, j = i++;
printf("i: %" PRIi32 " j: %" PRIi32 "\n", i, j);uint32_t ui = UINT_MAX, uj = ui++;
printf("ui: %" PRIu32 " uj: %" PRIu32 "\n", ui, uj);А это "argv[argc +1]" какое-то расширение в gcc8?
Что sizeof argv показывает?
> Что-то я не понял открытий.
> Результат следующих строк секрет что-ли был?Демка неочевидности UB, очевидно же.
Если не подводит память, то видел в блоге PVS-иков "частые неочевидные факапы-ошибки" (как-то так по смыслу)
> А это "argv[argc +1]" какое-то расширение в gcc8?Угу. "Расширение". Жуется gcc5 -std=c89
Обычный синтактический выверт ушами "читабельная запись для человеков" (т.е. никаких стат. проверок компилятора - хотя оно и понятно, т.к. тут нужен libastral наисвежей версии)
Из ModernC, Jens Gustedt, если что.
> Что sizeof argv показывает?то же самое, что и sizeof(char**), что же еще :)
> Обычный синтактический выверт ушамиЯ уж подумал - массивы переменной длины в параметрах функций.
Что-то типа:
gcc -x c -std=c99 - -o opennet << EOF
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{
char arr[ atoi(argv[1]) ];printf("sizeof arr: %u\n", sizeof arr);
return 0;
}
EOF
> Как нам уже избавиться от этих проклятий?Возможно, поздно.
> Как в NASA умудряются писать, что 40 лет работают космические аппараты
> (те же Вояджеры, например)?Слетайте в семидесятые и спросите...
А так http://drakon.su и сейчас доступен.
> Возможно, поздно?Почему?
> Слетайте в семидесятые и спросите
Ну вообще, видел у NASA сишний стайлгайд из 10 правил. Очень хардкорный: динамическую память нельзя, рекурсию нельзя, циклы без жёстко заданной верхней границы нельзя. Но и условия работы обязывают
ДРАКОН это не NASA. ;)
Просто программы создавали не программисты, а инженеры. Соответственные требования предъявлялись к ПО как к любому изделию. Там к каждой строчке различной документации по несколько страниц.
Так они писали на Ada. Когда этот язык приняли, то он считался очень сложным и перегруженным. Но, суде по последним стандартам C++ и развитию Rust, разработчики языков не успокоются пока всё оттуда не перетаскают. Интересно, стандарт C++ уже обогнал по объему Ada?
>Как в NASA умудряются писать, что 40 лет работают космические аппараты (те же Вояджеры, например)?На Fortran писали.
И таки, по крайней мере, один раз косяк случился, препод рассказывал. Вместо точки-разделителя целой-дробной части поставили запятую. Транслятор Фортрана воспринял это как два числа. В результате аппарат пролетел мимо Венеры.
Но, всё же, это не то, что сплошные проблемы с указателями.
Ну не всегда же на Фортране. Там были потом и Ада, и Си (поныне там)
Пора изобретать язык тёти Раи. :)
Если ты понимаешь лучше них, организуй свои соревнования!
Причём здесь соревнования? С ними все как раз нормально - нужное мероприятие, демонстрирующее наше несовершенство в кодинге. Ну и непосредственно полезное, ибо ошибки исправляются
Поставить Assert-ов на все входные/выходные данные (не обязательно контракты полностью реализовывать). Весь код покрыт самыми изощренными тестыми. Каждое принятое решение взвешивается и перевешивается, потом рефакторинг и по новой. Без исключений. Каждый метод, каждую строчку, каждый объект. Полная статистика всех созданных "обеъктов" (на что, когда и для каких целей выделена память).
Запретить работать с памятью напрямую, полностью задействовать все фичи прав доступа на современных процессорах (многопоточность и состояние гонки).
И...
Что и? Нифига не поможет в некоторых случаях, если имбицилы пишут код.
Не зря так долго коробку не обновляют. Страшенные баги месяцами висят, реактось от дополнений 6.0.4 синюшит сразу на установке ещё...Если даже после этого не обновят, то я не знаю куда .
QEMU хороший вариант. Только надо уметь думать.
о чем вы там думаете? Вызубрить командную строчку из миллиона закорючек (и менять раз в неделю, потому что авторы никак не успокоятся, меняя синтаксис в каждой версии) - это у вас "думать"?А об эффективности (и надежности) этого (по первоначальной задумке)_эмулятора_, в сочетании с kvm/libvirt (в виде спагетти взаимозавязанных механизмов, запутанных так что вообще не разберешь, кто там на ком стоял) - вам явно думать нечем.
> Ubuntu убран из числа окружений для взломаСлишком сложно или просто?
Никому не нужно
бросьте, и нужно, и ломают только в путь (благо векторов у непохаканной на корню - мильен). Но деньги за это платить - действительно, ненужно. Во-первых, у ломающих и так все в шоколаде - там от финорганизаций до инфраструктурных компаний ;-) во-вторых, лучше от этого бубунточка не станет - потому что там для начала надо уволить всю команду, и нанять вменяемых (а где их взять, если наверху - тот-кого-нельзя-тут-называть?)
потом выкинуть на помойку зависимость от инфраструктуры и разработчиков дебиllian, заодно заменив невменяемый apt-десять-лет-unstable-cli чем-то вроде zypper, а потом окажется что вы обратно suse изобрели, только не на базе шлак-вари, а на базе дебиана.
А она у нас и так есть. Ну, пока еще есть, завтра, небось, банкрот, не зря ж ее выкинули.
А я-то думал, что старый-добрый apt и дебиан - нерушимы как скалы
ну так вам - головой биться, или в работе применять?По факту убунте дебиан уже давно тормоз, а не источник вкусного и полезного мьяса халявных майнтейнеров. Но и спугнуть их нельзя, новые с неба не понападают. Поэтому все будет идти как идет.
Как и ты. :(
Видимо пришло время отдельное соревнование для опенсорса делать
Молодцы. Но много бесполезных проектов вроде Edge и Safari. Только деньги на ветер!
Почему же? Всякие бизнесьмены пользуют вышеназванные продукты. А денежки как раз у них и эти браузеры приходится знать, чтобы и себе пенсию обеспечить. Одно непонятно - где хромиум и его поделия.
В Virtualbox так то ошибки опасненькие.