Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LibProtection: 6 месяцев спустя

LibProtection: 6 месяцев спустя

Доклад Владимира Кочеткова (Positive Technologies) для PDUG-секции на PHDays 8.

More Decks by Positive Development User Group

Other Decks in Technology

Transcript

  1. Заголовок ptsecurity.com LibProtection – 6 месяцев спустя Positive Technologies Владимир

    Кочетков
  2. Заголовок 2 Мечтать не вредно? (1/2) 01 Response.Write( 02 $"<img

    src='//host/1/{a}' onclick='f({b})'/>" 03 );
  3. Заголовок 3 Мечтать не вредно? (2/2) 01 Response.Write( 02 SafeString.Format<Html>(

    03 $"<img src='//host/1/{a}' onclick='f({b})'/>" 04 ));
  4. Заголовок 4 Что такое LibProtection (1/3) LibProtection — библиотека с

    открытым под MIT-лицензией кодом, позволяющая разработчикам: • полностью автоматизировать защиту от атак инъекций по достаточному критерию; • реализовывать защиту по необходимому критерию. libprotection.org playground.libprotection.org (всё ещё ждём байпассов )
  5. Заголовок 5 Что такое LibProtection (2/3) Для защиты от атак

    в LibProtection реализованы: • автоматическая санитизация данных в точках инъекций там, где это возможно; • автоматическая валидация данных в точках инъекций по достаточному критерию (детектирование атаки) там, где невозможна санитизация; • возможность переопределения функций валидации и санитизации для обеспечения необходимого критерия.
  6. Заголовок 6 Что такое LibProtection (3/3) Поддерживаемые языки: • .NET,

    C++, JVM (Q4 2017 – Q2 2018) • PHP, Python, Ruby (2018) Текущий статус .NET, C++, JVM, JavaScript: пре-релиз. Поддерживаемые грамматики: SQL, HTML, JavaScript, URL, файловые пути
  7. Заголовок 7 LibProtection API: методы (.NET) // Форматирование строки с

    автоматической санитизацией и валидацией string SafeString<T>.Format(FormattableString formattable) string SafeString<T>.Format(string format, params object[] args) // Try-версия Format bool SafeString<T>.TryFormat(FormattableString formattable, out formatted) bool SafeString<T>.TryFormat(string format, out formatted, params object[] args) T ∈ { Sql, Html, JavaScript, Url, FilePath }
  8. Заголовок 8 Как это работает (/9) 01 Response.Write( 02 SafeString.Format<Html>(

    03 $"<img src='//host/1/{a}' onclick='f({b})'/>" 04 ));
  9. Заголовок 9 Как это работает (1/9) <img src='//host/1/{a}' onclick='f("{b}")'/>

  10. Заголовок 10 Как это работает (2/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/>
  11. Заголовок 11 Как это работает (3/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/>
  12. Заголовок 12 Как это работает (4/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/> < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' onclick = ' f ( "" ) ; alert ( 0 ) //" ) ' />
  13. Заголовок 13 Как это работает (5/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/> < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' onclick = ' f ( "" ) ; alert ( 0 ) //" ) ' /> UrlEncode JavaScriptStringEncode
  14. Заголовок 14 Как это работает (6/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/> < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' onclick = ' f ( "" ) ; alert ( 0 ) //" ) ' /> UrlEncode JavaScriptStringEncode <img src='//host/1/{a}' onclick='f("{b}")'/>
  15. Заголовок 15 Как это работает (7/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/> < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' onclick = ' f ( "" ) ; alert ( 0 ) //" ) ' /> UrlEncode JavaScriptStringEncode <img src='//host/1/{a}' onclick='f("{b}")'/> <img src='//host/1/%27onerror%3D%27alert%280%29' onclick='f("\&quot;);alert(0)//")'/>
  16. Заголовок 16 Как это работает (8/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/> < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' onclick = ' f ( "" ) ; alert ( 0 ) //" ) ' /> UrlEncode JavaScriptStringEncode <img src='//host/1/{a}' onclick='f("{b}")'/> <img src='//host/1/%27onerror%3D%27alert%280%29' onclick='f("\&quot;);alert(0)//")'/> < img src = ' // host / 1 / %27onerror%3D%27alert%280%29 ' onclick = ' f ( "\&quot;);alert(0)//" ) ' />
  17. Заголовок 17 Как это работает (9/9) 'onerror='alert(0) ");alert(0) <img src='//host/1/{a}'

    onclick='f("{b}")'/> <img src='//host/1/'onerror='alert(0)' onclick='f("");alert(0)//")'/> < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' onclick = ' f ( "" ) ; alert ( 0 ) //" ) ' /> UrlEncode JavaScriptStringEncode <img src='//host/1/{a}' onclick='f("{b}")'/> <img src='//host/1/%27onerror%3D%27alert%280%29' onclick='f("\&quot;);alert(0)//")'/> < img src = ' // host / 1 / %27onerror%3D%27alert%280%29 ' onclick = ' f ( "\&quot;);alert(0)//" ) ' />
  18. Заголовок 18 LibProtection API: форматные модификаторы // Отключение валидации и

    санитизации :safe // Переопределение валидатора :validate(method-name) method-name ∈ Func<string,bool> // Переопределение санитизатора :sanitize(method-name) method-name ∈ Func<string, string> // Переключение режима валидации :weak, :normal, :strong
  19. Заголовок 19 Режимы валидации • ValidationMode.Weak • Подсчёт токенов •

    Проверка категорий токенов • ValidationMode.Normal • Подсчёт токенов • Проверка категорий токенов • Контроль запрещённых токенов • ValidationMode.Strong (по умолчанию) • Контроль запрещённых токенов • Подсчёт токенов • Проверка категорий токенов
  20. Заголовок 20 Области применения LibProtection • Быстрый патчинг уязвимого кода,

    использующего форматные и интерполированные строки • Штатная защита кода там, где форматные строки или интерполяция неизбежны Что, если скрестить LibProtection и технологии SAST или DAST? ;)
  21. Заголовок 21 Влияние на производительность Незначительно замедляется обработка запросов, непосредственно

    приводящих приложение в точку выполнения потенциально опасной операции: Штатный трафик Атаки +1..3% +3..5%
  22. Заголовок 22 Neex (https://github.com/LibProtection/libprotection-dotnet/issues/45, false negative): SELECT * FROM myTable

    WHERE id = {0} AND myColumn = '{1}' /* legit comment */ 1 /* h<censored>a Байпасы и баги? Их есть у нас! (1/4)
  23. Заголовок 23 Frydaykg (https://github.com/LibProtection/libprotection- dotnet/issues/35, false positive): SELECT * FROM

    myTable WHERE '{0}' = 'any' and 1={1} \ 1 Байпасы и баги? Их есть у нас! (2/4)
  24. Заголовок 24 Frydaykg (https://github.com/LibProtection/libprotection- dotnet/issues/41, not a bug): {0}/{1} jsFile.js

    ?a jsFile.js a? Байпасы и баги? Их есть у нас! (3/4)
  25. Заголовок 25 Tank1st99 (https://github.com/LibProtection/libprotection- dotnet/issues/35, false positive & negative): <a

    href="#" onclick="alert(&quot;{0}&quot;);">test</a> False Positive <a href='#' onclick='alert(&quot;"{0}"&quot;);'>XSS</a> +alert(2)+ <a href="#" onclick='alert("Tom&{0}");'>XSS?</a> quot;);alert(2);// Байпасы и баги? Их есть у нас! (4/4)
  26. Заголовок ptsecurity.com Спасибо! Спасибо!