LINUX.ORG.RU

В Chrome и ChromeOS обнаружены уязвимости

 , , , ,


0

0

Компания Google сообщила об обновлении стабильного канала браузера Chrome, Chrome для Android и операционной системы ChromeOS, в связи с обнаружением 5 уязвимостей.

Одна из обнаруженных уязвимостей — критическая, и позволяет обойти все уровни защиты браузера и выполнить произвольный код за пределами sandbox-окружения.

Обнаруженные уязвимости в браузере Chrome:

  • CVE-2017-5055 — использование освобождённой памяти, критическая уязвимость в коде печати (Wadih Matar).
  • CVE-2017-5054 — переполнение буфера в JavaScript-движке V8 (Nicolas Trippar из Zimperium zLabs)
  • CVE-2017-5052 — ошибка приведения типов в Blink (JeongHoon Shin)
  • CVE-2017-5056 — использование памяти после освобождения в Blink (аноним)
  • CVE-2017-5053 — доступ к памяти вне границ (Team Sniper (Keen Lab и PC Mgr)

Обнаруженные уязвимости в ChromeOS:

  • CVE-2017-5054 — переполнение буфера в JavaScript-движке V8 (Nicolas Trippar из Zimperium zLabs)
  • CVE-2017-5052 — ошибка приведения типов в Blink (JeongHoon Shin)
  • CVE-2017-5056 — использование памяти после освобождения в Blink (аноним)
  • CVE-2017-5053 — доступ к памяти вне границ (Team Sniper (Keen Lab и PC Mgr)

Обнаруженные уязвимости в браузере Chrome для Android:

  • CVE-2017-5056 — использование памяти после освобождения в Blink (аноним)

Обновления с исправлением уязвимостей будут выпущены в ближайшее время, сообщает Google.

Многие из уязвимостей были найдены при помощи инструментов AddressSanitizer, MemorySanitizer, Control Flow Integrity и libFuzzer.

>>> Подробности

★★

Проверено: Shaman007 ()
Последнее исправление: Shaman007 (всего исправлений: 3)

Ответ на: комментарий от Thero

Какие виджеты??? Это же отдельные проги за отрисовку которых отвечает лаунчер... О_о

У меня ни один виджет из тех которые я запускал не пропал...

Я что-то не догоняю, походу, либо ты ошибаешься...

LinuxDebian ★★★★
()
Последнее исправление: LinuxDebian (всего исправлений: 4)
Ответ на: комментарий от ckotinko

Это значит, что прога штатно завершится, вызвав все деструкторы и прочее, в то время, как C++ упадёт сразу или позволит некоторое время читать чужую память.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это значит, что прога штатно завершится, вызвав все деструкторы и прочее, в то время, как C++ упадёт сразу или позволит некоторое время читать чужую память.

память чужого процесса никто тебе читать не позволит, расслабься

clover
()
Ответ на: комментарий от RazrFalcon

Пост об уязвимостях, которые rust предотвращает

последний раз спрашиваю: ты пост который комментируешь читал и понимаешь о чем там идёт речь, или не читал/не понимаешь, а просто увидел знакомые слова?

ты лучше задумайся-ка. я не просто так спрашиваю. задумайся, почему возникло CVE-2017-5054. о чем там идёт речь, а не просто реагируй на знакомые слова «переполнение буфера». я ссылку на описание проблемы давал в самом начале треда. даже намекну: «переполнение буфера» в этом баге это не переполнение буфера в самом V8. а в чём?

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 2)

Если софт правильный, его любая свинья съюзает... :-)

user_
()

В OpenBSD -current уже обновился Chromium в портах.
Тарболл исходников 57.0.2987.133 для тех у кого ещё не прилетело обновление Chromium здесь, в Gentoo кстати адаптировать существующий ебилд просто.

Arlecchino ★★
() автор топика
Ответ на: комментарий от rinsvid

внезапно, баг довольно странный.

там же кодогенератор внутри. он видит некое дерево операторов на входе у них константы. по идее он должен заменять каждый оператор от констант на константу результат. так он домотает до операции записи в массив, где у него должна стоять проверка адреса. проверка адреса не выкидывается если адрес константа, а в нашем случае проверка дает фиксированный результат - по идее это отброс проверки и обрезка недостижимых путей исполнения. останется кидок исключения. это в теории так должен отработать оптимизатор и заметь: это простые, тривиальные оптимизации.

а вот тут выкинулась проверка но не выкинулась ветвь исполнения. ассемблерная инструкция

mov    DWORD PTR [eax*4+0xa521b98],0x12345678
ничего не напоминает?
m32[((1-ff(NaN) >>> 0) % 0xdc4e153) & v] = 0x12345678;
по идее, тут надо задуматься еще и что делает перед нами константа 0xa521b98. не хороша она, ох не хороша. какая-то большая проблема в кодогенераторе V8. она очень велика для смещения. а выделенный массив лежит не по фиксированному адресу, и к нему она тоже отношения не имеет. откуда же такая гадость вылезла?

я слабо представляю, как нормальными оптимизациями добиться появления такой константы.

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

ты хочешь нам сказать, что если бы V8 был написан на расте с сохранением логики 1-в-1, этой уязвимости не было?

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

нука расскажи нам, как ржавый поможет от подобных ошибок. на примере CVE-2017-5054

Так «от ошибок, подобных приведенным в посте» или «от ошибок, подобных CVE-2017-5054»?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

конкретно от 5054. предположим, что нам завезли идеального ржавого, в котором нет изъянов и он компилится в абсолютно безопасный код. как этот ржавый спасет от 5054?

ckotinko ☆☆☆
()
Ответ на: комментарий от RazrFalcon

вот именно что. как собака павлова - увидел в заголовке buffer overflow и всё понял.

а потом таким программистам С++ в шаровары срёт.

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

Конкретно от 5054 - никак. Но половина багов в хедпосте - банальные выходы за границы, от которых идеальный ржавый спасет. И от использования после освобождения он тоже спасет - точнее, заставит писать программу так, чтобы такого использования не было.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от ckotinko

Всё же очевидно! v8 должен генерить не асм-код, а код на расте. Заодно получит и переносимость.

vzzo ★★★
()
Ответ на: комментарий от das_tier

Да, перевод немного некорректен.
Надо было перевести как «канала обновлений»

Arlecchino ★★
() автор топика
Ответ на: комментарий от rinsvid

скажем так - не обязательно это злой умысел, но рукожопия там выше крыши. Например, я не понимаю, как вообще такой ассемблерный код мог образоваться.

Код, который крахается собственно, если его разобрать до вида, которым оперирует кодогенератор, должен выглядеть так:

int __var1 = (toInt(1-ff(NaN) >>> 0) % 0xdc4e153); //const - вычислить в compile time
int __var2 = __var1 & v; //not const 
if (uint(__var2) > m32.lenght) //non-const vs const - выкинуть нельзя!
   throw ...
m32[__var2] = 0x12345678; //вот тут крах

m32 = это ссылка на некий буфер. она не const. т.е. я ожидал бы увидеть команду mov [4*reg + reg] = 0x12345678, где первый reg = __var2, а второй - адрес данных в буфере m32. а вместо этого мы видим mov [4*reg + const] = 0x12345678;

это как вообще? я конечно могу предполжить, что они держат внутренее один массив m32 на весь хип, и новые массивы просто мапают поверх него.

[global m32========[my m32]=====[another m32]=====]
но выгдядит это как дичь.

во вторых, как уже я говорил, у них явно различаются правила по которым считает оптимизатор и правила по которым считает javascript. но не ожидал что там всё так плохо:

Fix typing rule for Math.sign.
         case kMathSign:
-          return t->cache_.kMinusOneToOne;
+          return t->cache_.kMinusOneToOneOrMinusZeroOrNaN;
Как ошибка возникает:
(1-ff(NaN) >>> 0) % 0xdc4e153
на самом деле для компилятора должен выглядеть так
(castToInt(1-ff(NaN)) >>> 0) % 0xdc4e153
Оптимизатор думал что ответ ff будет в диапазоне [-1.. 1], т.е. 1-ff(...) = [0...2]. Ну ок, но 1-Sign(NaN) = NaN и приведется тоже к 0 по правилам JS. Если б они считали по правилам JS краха бы не было.

Опять же, там math.Sign от константы и ссылка на него тоже константна, и сама функция без side effectов. Не смогли его вычислить на месте? какая разница что там за typing rule, просто вычисли его блжадь и замени Sign(NaN)->NaN. И так далее по цепочке. Так все делают - gcc, llvm и таких проблем у них нет и быть не может.

То что они удалили проверку выхода за границы говорит о том, что они отслеживают как возможные диапазоны значений, так и возможные значения битов(0,1,unknown). В общем, стараются. Но вот свести саму константу не могут почему-то.

ckotinko ☆☆☆
()

Хорошая новость, столько уязвимостей исправлено

eternal_sorrow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.