• XSS.stack #1 – первый литературный журнал от юзеров форума

Fuzzing Jsfuzz: Тестер JavaScript кода

neopaket

Переводчик
Пользователь
Регистрация
14.05.2019
Сообщения
185
Реакции
205
Jsfuzz: Тестер JavaScript кода.

Jsfuzz программой, работающей на основе fuzzer для тестирования JavaScript /Nodejs.

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

Fuzzing можно рассматривать как мощную и эффективную стратегию в реальном программном обеспечении в дополнение к классическим Unit-тестам.


Использование.

Fuzz Target.


Первым шагом является реализация следующей функции (также называемой fuzz target):

Код:
function fuzz(buf) {
  // call your package with buf  
}
module.exports = {
    fuzz
};

Особенности Fuzz Target:

  • Jsfuzz будет вызывать цель fuzz в бесконечном цикле со случайными данными (в соответствии с алгоритмом покрытия), переданными buf (в отдельном процессе).
  • Функция должна перехватывать и игнорировать любые ожидаемые исключения, возникающие при передаче неверного ввода в тестируемый пакет.
  • Цель fuzz должна вызывать тестовую функцию/библиотеку с переданным буфером или преобразованием в тестовом буфере, если структура отличается или имеет другой тип.
  • Fuzz-функции также могут реализовывать проверки уровня приложения для обнаружения прикладных/логических ошибок. Например: декодировать буфер с помощью библиотеки testable, снова кодировать его и проверять, что оба результата равны. Чтобы сообщить результат/ошибку, функция должна выдать исключение.
  • jsfuzz сообщит о любых необработанных исключениях, таких как сбои, а также о входных данных, которые превысят лимит памяти, указанный для jsfuzz, или повиснут/будут превышать указанное время ожидания для каждого тестового случая.
Вот пример простой функции fuzz для jpeg-js модуля.

Код:
const jpeg = require('jpeg-js');

function fuzz(buf) {
    try {
        jpeg.decode(buf);
    } catch (e) {
        // Those are "valid" exceptions. we can't catch them in one line as
        // jpeg-js doesn't export/inherit from one exception class/style.
        if (e.message.indexOf('JPEG') !== -1 ||
            e.message.indexOf('length octect') !== -1 ||
            e.message.indexOf('Failed to') !== -1 ||
            e.message.indexOf('DecoderBuffer') !== -1 ||
            e.message.indexOf('invalid table spec') !== -1 ||
            e.message.indexOf('SOI not found1) !== -1) {
        } else {
            throw e;
        }
    }
}

module.exports = {
    fuzz
};

Собственно сам Jsfuzz в действии.

Следующим шагом является загрузка js-fuzz и запуск вашего фаззера.

Код:
npm i -g jsfuzz
jsfuzz ./examples/jpeg/fuzz.js corpus

# Output:
#0 READ units: 0
#1 NEW     cov: 61 corp: 0 exec/s: 1 rss: 23.37 MB
#23320 PULSE     cov: 61 corp: 1 exec/s: 10614 rss: 35.3 MB
#96022 NEW     cov: 70 corp: 1 exec/s: 11320 rss: 129.95 MB
#96971 NEW     cov: 78 corp: 2 exec/s: 10784 rss: 129.95 MB
#97046 NEW     cov: 79 corp: 3 exec/s: 9375 rss: 129.95 MB
#97081 NEW     cov: 81 corp: 4 exec/s: 11666 rss: 129.95 MB
#97195 NEW     cov: 93 corp: 5 exec/s: 9500 rss: 129.95 MB
#97216 NEW     cov: 97 corp: 6 exec/s: 10500 rss: 129.95 MB
#97238 NEW     cov: 102 corp: 7 exec/s: 11000 rss: 129.95 MB
#97303 NEW     cov: 108 corp: 8 exec/s: 10833 rss: 129.96 MB
#97857 PULSE     cov: 108 corp: 9 exec/s: 225 rss: 129.96 MB
#97857 PULSE     cov: 108 corp: 9 exec/s: 0 rss: 940.97 MB
#97857 PULSE     cov: 108 corp: 9 exec/s: 0 rss: 1566.01 MB
#97857 PULSE     cov: 108 corp: 9 exec/s: 0 rss: 2053.49 MB
MEMORY OOM: exceeded 2048 MB. Killing worker
Worker killed
crash was written to crash-819587841e3c275338593b0d195b6163d5208866870e2abf3be8cfc781d2688d
crash(hex)=ffd8ffc09dfdb0ffff0e5296bd7fbbc4f9579096bd7fbbfc0e80d50000ffff36fa400100236701bf73ffaf8003a57f097f5e000000008023c4f9579096bd7fbb008000001500b34e8c018fda5212

Jsfuzz будет генерировать и тестировать различные входные данные в бесконечном цикле. corpus является необязательным каталогом и будет использоваться для сохранения сгенерированных тестовых случаев, поэтому последующие запуски могут быть запущены из той же точки и предоставлены как начальный корпус.
JsFuzz также может начинаться с пустого каталога (т. Е. Без корпуса семени), хотя некоторые допустимые тестовые случаи в семени корпуса могут существенно ускорить фаззинг.
jsfuzz пытается имитировать некоторые аргументы и стиль вывода из libFuzzer .

Благодарности

jsfuzz процесс в значительной степени основывается на go-fuzz , первоначально разработанный Дмитрием Вьюковым. Который в свою очередь в значительной степени основан на AFL Михала Залевского .
Предыдущий пример этого был сделан [ https://github.com/connor4312/js-fuzz ] с немного другим дизайном, охватом и интерфейсом, но, похоже, в настоящее время он не поддерживается.
Для покрытия jsfuzz использует инструментарий istanbuljs и библиотеку покрытия.
Также автор Jsfuzz не против от пожертвований и сделать это вы можете по ссылке под моей благодарностью.


Спасибо за прочтение данной статьи и хочу выразить отдельное спасибо admin за предложение данной документации
Оригинальная документация: https://github.com/fuzzitdev/jsfuzz
neopaket


 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх