#prog #rust #itsec
Watch out for DoS when using Rust’s popular Hyper package
TL;DR: функция hyper::body::to_bytes выделяет память под запрос целиком, и попытка выделить большой объём памяти вызывает ошибку аллокации и, как следствие, прерывание работы программы. При этом для эксплуатации такого поведения не обязательно реально генерировать громадное содержимое запроса — достаточно сделать chunked запрос и передать один чанк, который не передаёт содержимое целиком. to_bytes в этом случае выделяет память, ориентируясь на значение
Справедливости ради, про опасность потребления произвольного количества памяти в документации указано. С другой стороны, тот факт, что для эксплуатации этого поведения не обязательно реального генерировать большой запрос — не столь очевиден.
Watch out for DoS when using Rust’s popular Hyper package
TL;DR: функция hyper::body::to_bytes выделяет память под запрос целиком, и попытка выделить большой объём памяти вызывает ошибку аллокации и, как следствие, прерывание работы программы. При этом для эксплуатации такого поведения не обязательно реально генерировать громадное содержимое запроса — достаточно сделать chunked запрос и передать один чанк, который не передаёт содержимое целиком. to_bytes в этом случае выделяет память, ориентируясь на значение
Content-Length
, которое, разумеется, может быть крайне большим.Справедливости ради, про опасность потребления произвольного количества памяти в документации указано. С другой стороны, тот факт, что для эксплуатации этого поведения не обязательно реального генерировать большой запрос — не столь очевиден.
JFrog
Potential DoS Vulnerability in Rust Hyper
⚡ATTENTION⚡ Devs that rely on hyper-rust: your own code should include limitations for HTTP Body size - Hyper library does not restrict by default. Find out more…
👍6
#prog #rust
Если ждать достаточно долго, то можно дождаться исполнения своего желания. В данном случае — желания разобраться с конкурентностью на низком уровне.
Небезызвестная Mara Bos опубликовала свою книгу: Rust Atomics and Locks: Low-Level Concurrency in Practice. Все главы можно прочитать бесплатно онлайн.
Если ждать достаточно долго, то можно дождаться исполнения своего желания. В данном случае — желания разобраться с конкурентностью на низком уровне.
Небезызвестная Mara Bos опубликовала свою книгу: Rust Atomics and Locks: Low-Level Concurrency in Practice. Все главы можно прочитать бесплатно онлайн.
marabos.nl
Rust Atomics and Locks by Mara Bos
Low-level Concurrency in Practice. This practical book helps Rust programmers of all levels gain a clear understanding of low-level concurrency. You'll learn everything about atomics and …
👏13🔥9👍2
#prog #rust
В C (и в C++) есть цикл
В Rust непосредственного аналога подобному циклу нет. Конечно, можно прописывать необходимые операции перед каждым оператором
Для получения аналогичного поведения нам понадобится labeled block break.
Покажу это на примере. Пусть есть вот такой код на C:
Другой недостаток — это то, что break по метке для произвольного блока — фича из недавнего релиза Rust, и, соответственно, на старых версиях работать не будет. К счастью, это при необходимости легко исправить: к блоку после метки приписывается ключевое слово
В C (и в C++) есть цикл
for
, который состоит из заголовка с тремя частями и тела:for (init; continue_condition; iter_action)Особенностью третьего выражения (которое я назвал
body;
iter_action
, а в стандарте называется expression-3
) является тот факт, что оно вычисляется в конце каждой итерации, причём вне зависимости от того, завершилась ли итерация нормально или же раньше посредством оператора continue
.В Rust непосредственного аналога подобному циклу нет. Конечно, можно прописывать необходимые операции перед каждым оператором
continue
, но это не DRY и способствует внесению ошибок — хотя бы из-за возможной необходимости менять код синхронно в нескольких местах. Но это не значит, что аналогичного нельзя добиться!Для получения аналогичного поведения нам понадобится labeled block break.
init
просто перемещается за пределы цикла, continue_condition
становится условием итерации, а iter_action
перемещается в конец тела, чтобы всегда исполняться в конце итерации. Тело цикла помещается в блок с меткой, и для перехода к исполнению iter_action
мы соответствующий оператор continue
заменяем на break
с меткой блока.Покажу это на примере. Пусть есть вот такой код на C:
for (int c = 0; c < 10; ++c) {Вот так будет выглядеть аналог по описанной выше трансформации:
op1(c);
if (cond(c)) {
++c;
continue;
}
op2(c);
}
let mut c = 0;
while c < 10 {
'loop_body: {
op1(c);
if cond(c) {
c += 1;
break 'loop_body;
}
op2(c);
};
c += 1;
}
Из недостатков данного подхода — то, что, в отличие от сишного оригинала, действия в конце итерации и условие продолжении итерации разнесены друг от друга. Для решения этой проблемы напрашивается макрос, но, к сожалению, на декларативных макросах сделать это весьма трудоёмко: нужно поменять continue
на break 'loop_body
, поменять break
на break 'whole_loop
(ещё и добавить 'whole_loop
на цикл в целом) — и при этом не трогать break
и continue
во вложенных циклах. Проще сделать процедурный. При этом, конечно, оно не будет нормально работать в случае, если в теле цикла есть макросы, которые раскрываются в код, содержащий break
и/или continue
.Другой недостаток — это то, что break по метке для произвольного блока — фича из недавнего релиза Rust, и, соответственно, на старых версиях работать не будет. К счастью, это при необходимости легко исправить: к блоку после метки приписывается ключевое слово
loop
— превращая, таким образом, в цикл — а в конце содержимого дописывается break
. Собственно, именно так люди раньше и делали до тех пор, пока данную фичу не завезли.Telegram
Блог*
#prog #rust #rustreleasenotes
Вышла версия Rust 1.65.0! Как всегда, вычленю только то, что интересно мне, за подробностями в RELEASES.md.
▪️Generic associated types (GAT) стабилизировали. Не буду повторять ещё раз, почему это так важно, и просто покажу…
Вышла версия Rust 1.65.0! Как всегда, вычленю только то, что интересно мне, за подробностями в RELEASES.md.
▪️Generic associated types (GAT) стабилизировали. Не буду повторять ещё раз, почему это так важно, и просто покажу…
🤯1
#prog #performancetrap #video
"Performance Matters" by Emery Berger
Фактически презентация двух инструментов для анализа производительности.
Первый — Stabilizer. Производительность программ в немалой степени зависит от того, как данные располагаются в памяти, и от окружения, в котором программы запускаются. Автор видео ссылается на статью, которая показывает, что эффект этих переменных может быть весьма значителен и перекрывать даже разницу между оптимизированным и неоптимизированным кодом. Stabilizer в рантайме каждые пол-секунды меняет раскладку кода и данных в куче, что позволяет снимать профиль производительности с учётом всех возможных влияний раскладки кода. Из-за применимости в данном случае центральной предельной теоремы общее влияние раскладки описывается (для достаточно большого количества исследованных данных) нормальным распределением, что позволяет задействовать статистические методы для того, чтобы замерить, насколько вклад в изменение производительности обусловлен изменениями в коде. К сожалению, этот инструмент более активно не развивается.
Второй инструмент (более живой) — это coz, causal profiler. Этот профайлер позволяет ценой небольших аннотаций исходного кода оценить, насколько сильно изменение производительности одного компонента сказывается на производительности системы в целом. Так как просто взять и ускорить код невозможно, coz достигает требуемых эффектов за счёт замедления всех остальных компонентов. В видео рассказывается о том, как coz помог в реальных случаях, на какие неожиданные узкие места указывал и о том, насколько хорошо замеренные прибавки в производительности согласовывались с предсказаниями инструмента.
Забавно, что это видео я уже смотрел, Даня упоминал coz у себя на канале, но только сейчас наткнулся на него снова и выложил у себя.
"Performance Matters" by Emery Berger
Фактически презентация двух инструментов для анализа производительности.
Первый — Stabilizer. Производительность программ в немалой степени зависит от того, как данные располагаются в памяти, и от окружения, в котором программы запускаются. Автор видео ссылается на статью, которая показывает, что эффект этих переменных может быть весьма значителен и перекрывать даже разницу между оптимизированным и неоптимизированным кодом. Stabilizer в рантайме каждые пол-секунды меняет раскладку кода и данных в куче, что позволяет снимать профиль производительности с учётом всех возможных влияний раскладки кода. Из-за применимости в данном случае центральной предельной теоремы общее влияние раскладки описывается (для достаточно большого количества исследованных данных) нормальным распределением, что позволяет задействовать статистические методы для того, чтобы замерить, насколько вклад в изменение производительности обусловлен изменениями в коде. К сожалению, этот инструмент более активно не развивается.
Второй инструмент (более живой) — это coz, causal profiler. Этот профайлер позволяет ценой небольших аннотаций исходного кода оценить, насколько сильно изменение производительности одного компонента сказывается на производительности системы в целом. Так как просто взять и ускорить код невозможно, coz достигает требуемых эффектов за счёт замедления всех остальных компонентов. В видео рассказывается о том, как coz помог в реальных случаях, на какие неожиданные узкие места указывал и о том, насколько хорошо замеренные прибавки в производительности согласовывались с предсказаниями инструмента.
Забавно, что это видео я уже смотрел, Даня упоминал coz у себя на канале, но только сейчас наткнулся на него снова и выложил у себя.
YouTube
"Performance Matters" by Emery Berger
Performance clearly matters to users. For example, the most common software update on the AppStore is "Bug fixes and performance enhancements." Now that Moore's Law has ended, programmers have to work hard to get high performance for their applications. But…
🔥3👍2
#prog #python #video
"Python Performance Matters" by Emery Berger
Обзор профайлера для Python под названием Scalene, чем он лучше прочих профайлеров и как может помочь с конкретным кодом.
"Python Performance Matters" by Emery Berger
Обзор профайлера для Python под названием Scalene, чем он лучше прочих профайлеров и как может помочь с конкретным кодом.
YouTube
"Python Performance Matters" by Emery Berger (Strange Loop 2022)
It's 2022. Moore's Law and Dennard scaling have run out of steam, making it harder than ever to achieve high performance - especially in Python. This talk first explains in detail the unique challenges that Python poses to programmers. It then presents Scalene…
🔥1
Блог*
Сделал, performancetrap
Я вот думаю, может, автоматически добавлять хештег performancetrap к каждому посту с хештегом Python?
😁13👍1👌1
#prog #rust #rustlib
safe_cell
This crate exports the
The use case is similar to that of the standard library's
As the implementation is incredibly lightweight and does not make use of any additional synchronization primitives or dynamic borrow tracking, it has negligible overhead (and hence functions as a true "zero-cost abstraction").
safe_cell
This crate exports the
SafeCell
type, a wrapper type that enables safe exterior mutability for arbitrary contents.The use case is similar to that of the standard library's
UnsafeCell
type but, by virtue of being specialized for situations where it can be statically proven that no unsound access occurs, SafeCell
is fully usable in safe code. In addition, the implementation is easily proven to be fully sound, making SafeCell
a great alternative to UnsafeCell
in safety-critical code.As the implementation is incredibly lightweight and does not make use of any additional synchronization primitives or dynamic borrow tracking, it has negligible overhead (and hence functions as a true "zero-cost abstraction").
🌚7
Блог*
Первый НГ, на котором пропустил куранты
На этот Новый год, кстати, тоже пропустил. Но на этот раз намеренно, не хотел лишний раз на рожу понятно кого смотреть и слушать скучную дичь, которую он втирает
👍10❤🔥2🤣2🤡1