Forwarded from ТГ Шевченка
Думав над руським словом закадичний і як перекласти це англомовній людині
Прийшов до deepthroat friend
Прийшов до deepthroat friend
😁17🌚5
Forwarded from Neural Machine
Очень грустно, что мне лично приходится нести последствия своих решений.
😭10👍1
Forwarded from Lenix
Коллеги, добрый день
Решили поделиться опытом фаззинга dhcp сервера с помощью фаззера nyx-net. Перед нами стояла задача пофаззить dnsmasq, причём функционал, отвечающий за dhcp сервер. Мы решили, что данная цель хорошо подходит для того, чтобы потренироваться фаззингу клиент-серверных приложений с сохранением состояния (Crusher, AFLNet, StateAFL, SGFuzz). Мы давно хотели попробовать запустить [SGFuzz](https://github.com/bajinsheng/SGFuzz), но он к сожалению работает только с tcp протоколами, а dhcp протокол работает на udp. Поэтому сначала мы решили попробовать запустить AFLNet.
Fuzzing dnsmasq with AFLNet
AFLNet - это graybox фаззер, который позволяет тестировать имплементацию протоколов в сетевых серверах или клиентах. AFLNet выступает в качестве клиента, отправляя серверу смутированные пакеты. При этом фаззер учитывает не только покрытие кода тестируемого проекта, но и его состояние. Состояние сервера определяется с помощью кода возврата в ответе от сервера (например, код 200 в HTTP протоколе). При этом в качестве начального корпуса фаззер использует записанные с помощью tcpdump (или другой утилиты для захвата сетевого трафика) пакеты.
Таким образом, AFLNet пытается обеспечить максимальную имитацию реальных условий использования целевой программы. Ведь фаззить сетевое приложение с помощью стандартных подходов зачастую оказывается довольно сложно, так как какую-нибудь отдельную функцию сложно выделить из приложения из-за глобального состояния сервера. Поэтому в некоторых случаях настройка фаззинга сетевого приложения с помощью AFLNet является в разы проще чем стандартными фаззерами (AFL++, LibFuzzer).
Но к сожалению, у AFLNet есть большой недостаток - скорость фаззинга:
- AFLNet передаёт пакеты по сети, что довольно медленно в условиях фаззинга.
- AFLNet использует задержку по времени для инициализации сервера. То есть AFLNet ждёт определённое количество времени для инициализации сервера прежде чем отправить пакет.
- AFLNet использует задержку по времени чтобы дождаться ответа от сервера. То есть фаззер будет просто ждать некоторое время ответа от сервера и если ответа не поступило, то только после истечения этого таймаута фаззер завершит сессию.
Всё это приводит к очень низкой скорости фаззинга (в наших условиях было ~10 запусков в секунду).
Fuzzing dnsmasq with nyx-net
Мы решили посмотреть, какие существуют альтернативы AFLNet, которые позволяют нам решить перечисленные проблемы. Нас заинтересовал инструмент nyx-net. Nyx-Net - это snapshot based graybox фаззер, основанный на фаззере nyx. Использование снепшотов для фаззинга позволяет решить озвученные проблемы:
- nyx-net подменяет общение по сети на работу с shared memory. Этот механизм используется не только для увеличения скорости доставки тесткейса до целевой программы, но и для определения состояния сервера (например, сервер готов к считыванию пакета).
- nyx-net отслеживает вызовы чтения и записи в сетевой сокет. Таким образом, фаззер создаст базовый снепшот (root snapshot) перед вызовом функции для чтения из сокета. В дальнейшем при фаззинге фаззер будет откатываться до этого базового снепшота, чтобы начать новую сессию. Такой метод позволяет избежать задержки по времени при инициализации серевера.
- nyx-net создаёт возрастающие (incremental) снепшоты. То есть после отправки нескольких пакетов фаззер может сделать снепшот и потом откатываться уже до этого состояния, а не до базового снепшота. Таким образом, фаззеру не нужно воспроизводить цепочку пакетов, чтобы исследовать, как ведёт себя сервер в открытом состоянии при получении новых пакетов.
Но к сожалению, в nyx-net не было реализовано функции для подмены вызова
Таким образом, у нас получилось увеличить скорость фаззинга dnsmasq с помощью Nyx-Net примерно в 450 раз по сравнению с AFLNet. Поэтому рекомендуем добавить этот фаззер в свой набор инструментов.
Решили поделиться опытом фаззинга dhcp сервера с помощью фаззера nyx-net. Перед нами стояла задача пофаззить dnsmasq, причём функционал, отвечающий за dhcp сервер. Мы решили, что данная цель хорошо подходит для того, чтобы потренироваться фаззингу клиент-серверных приложений с сохранением состояния (Crusher, AFLNet, StateAFL, SGFuzz). Мы давно хотели попробовать запустить [SGFuzz](https://github.com/bajinsheng/SGFuzz), но он к сожалению работает только с tcp протоколами, а dhcp протокол работает на udp. Поэтому сначала мы решили попробовать запустить AFLNet.
Fuzzing dnsmasq with AFLNet
AFLNet - это graybox фаззер, который позволяет тестировать имплементацию протоколов в сетевых серверах или клиентах. AFLNet выступает в качестве клиента, отправляя серверу смутированные пакеты. При этом фаззер учитывает не только покрытие кода тестируемого проекта, но и его состояние. Состояние сервера определяется с помощью кода возврата в ответе от сервера (например, код 200 в HTTP протоколе). При этом в качестве начального корпуса фаззер использует записанные с помощью tcpdump (или другой утилиты для захвата сетевого трафика) пакеты.
Таким образом, AFLNet пытается обеспечить максимальную имитацию реальных условий использования целевой программы. Ведь фаззить сетевое приложение с помощью стандартных подходов зачастую оказывается довольно сложно, так как какую-нибудь отдельную функцию сложно выделить из приложения из-за глобального состояния сервера. Поэтому в некоторых случаях настройка фаззинга сетевого приложения с помощью AFLNet является в разы проще чем стандартными фаззерами (AFL++, LibFuzzer).
Но к сожалению, у AFLNet есть большой недостаток - скорость фаззинга:
- AFLNet передаёт пакеты по сети, что довольно медленно в условиях фаззинга.
- AFLNet использует задержку по времени для инициализации сервера. То есть AFLNet ждёт определённое количество времени для инициализации сервера прежде чем отправить пакет.
- AFLNet использует задержку по времени чтобы дождаться ответа от сервера. То есть фаззер будет просто ждать некоторое время ответа от сервера и если ответа не поступило, то только после истечения этого таймаута фаззер завершит сессию.
Всё это приводит к очень низкой скорости фаззинга (в наших условиях было ~10 запусков в секунду).
Fuzzing dnsmasq with nyx-net
Мы решили посмотреть, какие существуют альтернативы AFLNet, которые позволяют нам решить перечисленные проблемы. Нас заинтересовал инструмент nyx-net. Nyx-Net - это snapshot based graybox фаззер, основанный на фаззере nyx. Использование снепшотов для фаззинга позволяет решить озвученные проблемы:
- nyx-net подменяет общение по сети на работу с shared memory. Этот механизм используется не только для увеличения скорости доставки тесткейса до целевой программы, но и для определения состояния сервера (например, сервер готов к считыванию пакета).
- nyx-net отслеживает вызовы чтения и записи в сетевой сокет. Таким образом, фаззер создаст базовый снепшот (root snapshot) перед вызовом функции для чтения из сокета. В дальнейшем при фаззинге фаззер будет откатываться до этого базового снепшота, чтобы начать новую сессию. Такой метод позволяет избежать задержки по времени при инициализации серевера.
- nyx-net создаёт возрастающие (incremental) снепшоты. То есть после отправки нескольких пакетов фаззер может сделать снепшот и потом откатываться уже до этого состояния, а не до базового снепшота. Таким образом, фаззеру не нужно воспроизводить цепочку пакетов, чтобы исследовать, как ведёт себя сервер в открытом состоянии при получении новых пакетов.
Но к сожалению, в nyx-net не было реализовано функции для подмены вызова
recvmsg()
, которая используется в dnsmasq для чтения сообщения и дополнительной информации из сокета. Поэтому мы написали свой патч, который эмулирует работу этого вызова, и отправили его разработчикам.Таким образом, у нас получилось увеличить скорость фаззинга dnsmasq с помощью Nyx-Net примерно в 450 раз по сравнению с AFLNet. Поэтому рекомендуем добавить этот фаззер в свой набор инструментов.
👍4🔥1
Блог*
Временами нужная std::iter::repeat_n. В отличие от repeat(x).take(n) может не клонировать на последней итерации.
🔸...Но чуть менее нужная, поскольку Take<Repeat<T>> и Take<RepeatWith<T>> теперь реализуют ExactSizeIterator, а Take<Repeat<T>> ещё и DoubleEndedIterator
🔸...Но чуть менее нужная, поскольку Take<Repeat<T>> и Take<RepeatWith<T>> теперь реализуют ExactSizeIterator, а Take<Repeat<T>> ещё и DoubleEndedIterator
BTW я в документации заметил это:
This is very similar to using repeat() with Iterator::take(), but there are two differences:
* repeat_n() can return the original value, rather than always cloning.
* repeat_n() produces an ExactSizeIterator.
Второе замечание перестало быть верным в той же версии, как я и написал в своих заметках о релизе. Я решил это исправить и сделал PR (который в итоге оперативно смержили).
Как оказалось, я не один такой умный — другой человек менее чем через час прислал PR с абсолютно идентичным диффом. Конечно, он его потом закрыл, как дубликат.
This is very similar to using repeat() with Iterator::take(), but there are two differences:
* repeat_n() can return the original value, rather than always cloning.
* repeat_n() produces an ExactSizeIterator.
Второе замечание перестало быть верным в той же версии, как я и написал в своих заметках о релизе. Я решил это исправить и сделал PR (который в итоге оперативно смержили).
Как оказалось, я не один такой умный — другой человек менее чем через час прислал PR с абсолютно идентичным диффом. Конечно, он его потом закрыл, как дубликат.
GitHub
Remove outdated documentation for `repeat_n` by AnthonyMikh · Pull Request #131858 · rust-lang/rust
After #106943, which made Take<Repeat<I>> implement ExactSizeIterator, part of documentation about difference from repeat(x).take(n) is no longer valid.
@rustbot labels:...
@rustbot labels:...
😁10👍3🫡1
#prog #rust #rustlib
walkdir — кросс-платформерная библиотека для рекурсивного обхода директорий от Andrew Gallant aka Burntsushi.
Библиотека умеет обнаруживает циклы символьных ссылок и сообщать в этих случаях об ошибке.
Небольшое неудобство заключается в том, что
walkdir — кросс-платформерная библиотека для рекурсивного обхода директорий от Andrew Gallant aka Burntsushi.
use walkdir::WalkDir;
for entry in WalkDir::new("foo").min_depth(1).max_depth(3) {
println!("{}", entry?.path().display());
}
Библиотека умеет обнаруживает циклы символьных ссылок и сообщать в этих случаях об ошибке.
Небольшое неудобство заключается в том, что
.filter()
на итераторе не будет предотвращать заход в пропущенные директории, для этого нужно на итераторе вызвать .filter_entry()
. Пример из документации для пропуска скрытых файлов на *nix-системах:use walkdir::{DirEntry, WalkDir};
fn is_hidden(entry: &DirEntry) -> bool {
entry.file_name()
.to_str()
.map(|s| s.starts_with("."))
.unwrap_or(false)
}
for entry in WalkDir::new("foo")
.into_iter()
.filter_entry(|e| !is_hidden(e)) {
println!("{}", entry?.path().display());
}
docs.rs
walkdir - Rust
Crate `walkdir` provides an efficient and cross platform implementation of recursive directory traversal. Several options are exposed to control iteration, such as whether to follow symbolic links (default off), limit the maximum number of simultaneous open…
👍9❤🔥4