Forwarded from Блог*
#prog #rust #python #article #suckassstory #performancetrap
Rust std fs slower than Python!? No, it's hardware!
Редкий случай, когда удалось отследить баг и подтвердить, что он действительно в железе.
TL;DR: оба вариант кода используют mmap в качестве буфера для считывания из файла, но в Python этот буфер используется с некоторым смещением. На некоторых процессорах — в том числе в том, который используется на машине автора — команда
Rust std fs slower than Python!? No, it's hardware!
Редкий случай, когда удалось отследить баг и подтвердить, что он действительно в железе.
TL;DR: оба вариант кода используют mmap в качестве буфера для считывания из файла, но в Python этот буфер используется с некоторым смещением. На некоторых процессорах — в том числе в том, который используется на машине автора — команда
rep movsb — которая использовалась в реализации memcpy — парадоксальным образом работает на порядок более медленно при работе с выровненным буфером.xuanwo.io
Rust std fs slower than Python!? No, it's hardware!
Achieving Data Freedom Through Open Source and Rust
🆒6👍2❤1
Forwarded from PetrSec Notes
Deref of Null в интерпретаторе CPython 3.11+ 💥
Примерно полтора месяца назад я нашёл интересный баг в модуле
Но, как известно
Далее я попытался понять каким образом могу вызвать выполнение этой строки, причем, чтобы пришел именно
Этот код, запущенный через
Оценить критичность находки в тот момент было для меня затруднительно, но было понятно одно - данный баг может привести к DoS только в случае когда:
1. В скрипте регистрируется custom window function при работе с SQLite.
2. Скрипт позволяет внешнему пользователю управлять содержимым SQL запроса. То есть этот баг может использоваться только в цепочке эксплойтов. К примеру SQL-injection + этот DoS.
Поскольку, я не до конца понимал насколько вообще распространён код подобного вида в продакшене, на всякий случай решил этот баг отправить через приватный Security Advisories на GitHub. В результате переписки с мэйнтейнерами выяснилось что это обычный баг, он недостижиим извне - поэтому следующим шагом я создал публичный issue - в нем подробнее описаны технические детали. Даже хотел в ближайшее время заняться и исправить этот баг, но меня немного опередили)) Нашелся доброволец, который вроде как починил это через
В результате всего мне удалось много узнать о том, как вообще выстроен процесс репортинга уязвимостей и багов в
А ещё, мне кажется, находить подобные баги можно так же методом фаззинга самого интерпретатора CPython через кастомные мутаторы AFL++ на основе формальной грамматики python3, как нибудь попробую эту тему изучить.
#bug #python #svace #opensource
Примерно полтора месяца назад я нашёл интересный баг в модуле
sqlite3 стандартной библиотеки CPython. После сборки под статическим анализатором Svace и запуска анализа, Svacer подсветил маркер DEREF_OF_NULL.RET.LIB (CWE-476) в Modules/_sqlite/connection.c - возможное разыменование нулевого указателя cls. NULL может вернуть функция sqlite3_aggregate_context() несколькими строками выше. Причем после неё и так уже стоитassert(cls != NULL);
Но, как известно
assert() работает только в отладочных сборках, но не в релизе. Значит в релизе оно вполне может выстрелить, потому что по коду других причин почему это не может случиться я не нашел)Далее я попытался понять каким образом могу вызвать выполнение этой строки, причем, чтобы пришел именно
NULL после sqlite3_aggregate_context(). И, через некоторое время у меня был готов минимальный репродюсер:import sqlite3
class A:
def value(self):
return 1
con = sqlite3.connect(":memory:")
con.create_window_function("f", 1, A)
con.execute("CREATE TABLE t(x)")
con.execute("INSERT INTO t VALUES (1)")
con.execute("""
SELECT f(x)
OVER (ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
FROM t
""").fetchall()
Этот код, запущенный через
REPL, роняет интерпретатор с SIGSEGV, у меня падает вот так:zsh: segmentation fault (core dumped) python3
Оценить критичность находки в тот момент было для меня затруднительно, но было понятно одно - данный баг может привести к DoS только в случае когда:
1. В скрипте регистрируется custom window function при работе с SQLite.
2. Скрипт позволяет внешнему пользователю управлять содержимым SQL запроса. То есть этот баг может использоваться только в цепочке эксплойтов. К примеру SQL-injection + этот DoS.
Поскольку, я не до конца понимал насколько вообще распространён код подобного вида в продакшене, на всякий случай решил этот баг отправить через приватный Security Advisories на GitHub. В результате переписки с мэйнтейнерами выяснилось что это обычный баг, он недостижиим извне - поэтому следующим шагом я создал публичный issue - в нем подробнее описаны технические детали. Даже хотел в ближайшее время заняться и исправить этот баг, но меня немного опередили)) Нашелся доброволец, который вроде как починил это через
Claude Code😀, фикс пока на стадии ревью и вроде выглядит +- норм.В результате всего мне удалось много узнать о том, как вообще выстроен процесс репортинга уязвимостей и багов в
CPython.А ещё, мне кажется, находить подобные баги можно так же методом фаззинга самого интерпретатора CPython через кастомные мутаторы AFL++ на основе формальной грамматики python3, как нибудь попробую эту тему изучить.
#bug #python #svace #opensource
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥5😁1