<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Безопасный код</title>
    <description>Статьи, которые объяснят вам, что может пойти не так при разработке и как сделать свой код безопасным.</description>
    <link>https://tproger.ru/tag/safe-code</link>
    <atom:link href="https://tproger.ru/tag/safe-code/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 18 Oct 2026 23:22:00 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Безопасный код</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Кроах-Хартман: Rust поможет Linux и делает кодинг веселее</title>
      <link>https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee</link>
      <comments>https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee</guid>
      <description><![CDATA[<p>Грег Кроах-Хартман заявил, что Rust становится частью Linux и поможет убрать до 80% уязвимостей ядра. Рассказываем, что это значит.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee">Кроах-Хартман: Rust поможет Linux и делает кодинг веселее</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 20 Jul 2026 08:09:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Один из главных мейнтейнеров стабильной ветки ядра Linux <b>Грег Кроах-Хартман</b> заявил, что Rust уже не эксперимент, а часть долгосрочной стратегии экосистемы. По его словам, переход на Rust поможет убрать львиную долю рутинных уязвимостей ядра и облегчит жизнь мейнтейнерам.</p><p>На конференции <b>Open Source Summit India 2026</b> в Мумбаи Кроах-Хартман выступил с докладом <a href="https://www.youtube.com/watch?v=1nYl_9wBBhE&amp;list=PLEAGIV5X5B1U&amp;index=19">«Rust and Linux: How the Rust Language is Going to Help Linux Succeed»</a>. В нём он признался, что поначалу относился к языку скептически и считал, что всё необходимое уже есть в C. Сейчас он считает иначе: Rust действительно делает программирование интереснее и безопаснее.</p><ul><li>Грег Кроах-Хартман назвал Rust постоянной частью Linux, а не временным экспериментом.</li><li>По его оценке, около 80% уязвимостей ядра за последние 25 лет можно было бы поймать на этапе компиляции Rust.</li><li>Linux получает около 13 CVE в день и почти 9 изменений в час на протяжении десяти лет и более.</li><li>Binder — ключевой механизм IPC Android — уже имеет параллельную реализацию на Rust, а C-версия скоро уйдёт.</li><li>Git и ряд других крупных проектов также движутся в сторону Rust.</li></ul><h2>От скептицизма к поддержке</h2><p>Кроах-Хартман рассказал, что несколько лет назад друг советовал ему попробовать Rust, но он отмахнулся: C казался достаточным. Со временем он изменил мнение. «Он был прав. Я должен был сделать это тогда. Rust на самом деле весёлый. Он заставляет программирование быть весёлым», — сказал мейнтейнер.</p><p>Главное преимущество языка в ядерной разработке — владение и типизация, которые убирают массу мелких ошибок: непроверенные указатели, забытые разблокировки, неправильная очистка ресурсов. Именно такие баги, по словам Кроах-Хартмана, составляют большинство ежедневных CVE.</p><h2>Масштаб проблемы</h2><p>Linux развивается с огромной скоростью. Кроах-Хартман привёл цифры: ядро набирает примерно <b>девять изменений в час</b> уже больше десяти лет, а количество публично раскрываемых уязвимостей держится на уровне <b>около 13 CVE в день</b>. Большая часть из них — не сложные атаки, а простые ошибки в C-коде.</p><blockquote>Я видел каждую CVE ядра за последние 25 лет. Думаю, 80% исчезли бы просто потому, что Rust поймал бы их.</blockquote><h2>Что уже меняется в ядре</h2><p>Rust постепенно становится обязательным выбором для отдельных подсистем. Кроах-Хартман отметил, что <b>новые драйверы некоторых подсистем будут приниматься только на Rust</b>. Яркий пример — Binder, межпроцессный механизм Android, от которого зависят миллиарды устройств. В ядре уже существуют параллельные реализации Binder на C и Rust, и C-версия «скоро исчезнет».</p><p>Это означает, что Rust станет фундаментом не только для экспериментальных модулей, но и для ключевой инфраструктуры мобильной экосистемы.</p><p><b>Контекст:</b><br />Binder — это механизм межпроцессного взаимодействия (IPC) в Android. Он позволяет приложениям и системным сервисам безопасно обмениваться данными. Переписывание Binder на Rust напрямую влияет на безопасность и стабильность почти всех Android-устройств.</p><h2>Выводы</h2><p>Позиция Кроах-Хартмана — ещё один сигнал того, что Rust перешёл из разряда «перспективного языка» в разряд инфраструктурного инструмента. Если оценка в 80% CVE верна, массовый переход на Rust в ядре может существенно снизить количество исправлений безопасности и освободить время мейнтейнеров для сложных логических задач.</p><p>Источник: <a href="https://developers.slashdot.org/story/26/07/20/0417244/rust-will-help-linux-succeed-and-makes-coding-fun-says-greg-kroah-hartman">Slashdot</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>ИИ-агент впервые провёл полную ransomware-атаку: разбор JadePuffer</title>
      <link>https://tproger.ru/news/ii-agent-vpervye-provyol-polnuyu-ransomware-ataku-razbor-jadepuff</link>
      <comments>https://tproger.ru/news/ii-agent-vpervye-provyol-polnuyu-ransomware-ataku-razbor-jadepuff?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ii-agent-vpervye-provyol-polnuyu-ransomware-ataku-razbor-jadepuff</guid>
      <description><![CDATA[<p>Исследователи Sysdig описали JadePuffer — ИИ-агента, который сам взломал сервер, зашифровал данные и оставил требование выкупа. Проверьте свои сервисы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ii-agent-vpervye-provyol-polnuyu-ransomware-ataku-razbor-jadepuff">ИИ-агент впервые провёл полную ransomware-атаку: разбор JadePuffer</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Jul 2026 12:17:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если в вашей инфраструктуре торчат в интернет <b>Langflow</b> или <b>Nacos</b> — проверьте их сейчас. Исследователи Sysdig описали первую задокументированную ransomware-атаку, которую от начала до конца провёл ИИ-агент без участия человека.</p><ul><li>ИИ-агент <b>JadePuffer</b> использовал CVE-2025-3248 в Langflow для первичного доступа.</li><li>Агент адаптировался в реальном времени: после неудачного входа нашёл рабочее решение за <b>31 секунду</b>.</li><li>Зашифрованы <b>1342 конфигурации Nacos</b>; платить выкуп бесполезно, так как схемы базы данных уничтожены.</li><li>Защита: убрать Langflow и Nacos из интернета, сменить стандартные ключи и не хранить API-ключи на оркестраторах ИИ.</li></ul><h2>Как развивалась атака</h2><p>Sysdig назвала угрозу <b>JadePuffer</b>. Агент начал с открытого в интернете экземпляра <a href="https://www.langflow.org/">Langflow</a> — фреймворка для построения конвейеров ИИ, и воспользовался уязвимостью CVE-2025-3248, которая позволяет удалённо выполнить произвольный Python-код без аутентификации.</p><p>Попав внутрь, агент собирал секреты: ключи провайдеров ИИ, облачные учётные данные, кошельки криптовалют и пароли к базам данных. Особое внимание он уделял китайским облакам — Alibaba, Aliyun, Tencent и Huawei, — но не обходил стороной AWS, Azure и Google Cloud. Для закрепления агент добавил задачу в crontab, которая каждые 30 минут связывалась с инфраструктурой злоумышленников.</p><p>Конечной целью стал отдельный продакшен-сервер с <b>MySQL</b> и сервисом конфигураций <b>Nacos</b> от Alibaba. Агент подключился к MySQL под root, использовал обход авторизации CVE-2021-29441 и подделал JWT с помощью стандартного ключа Nacos. В итоге он зашифровал все 1342 конфигурации встроенной функцией AES и оставил записку с требованием выкупа, биткоин-адресом и почтой Proton Mail.</p><h2>Почему платить не имеет смысла</h2><p>Классический ransomware обычно хранит ключи или резервные копии, чтобы расшифровать данные после оплаты. JadePuffer действовал иначе: он уничтожал целые схемы базы данных, не сохраняя возможности восстановления. По словам директора по исследованию угроз Sysdig <b>Майкла Кларка</b>, агент «переходил от удаления строк к сбросу целых схем БД, проговаривая собственную логику выбора целей».</p><h2>Как защититься</h2><ol><li>Закройте от интернета конечные точки Langflow и Nacos — они не должны быть публично доступны.</li><li>Обновите Langflow до версии без CVE-2025-3248.</li><li>Смените стандартный token.secret.key в Nacos и используйте принудительную настройку собственного ключа.</li><li>Не храните API-ключи провайдеров ИИ и облачные учётные данные в окружении оркестраторов ИИ.</li></ol><p>Атака JadePuffer показывает, что порог входа для ransomware опустился до стоимости запуска ИИ-агента. Если агент работает на украденных учётных данных через LLMjacking, затраты злоумышленника близки к нулю. Источник: <a href="https://www.theregister.com/security/2026/07/02/smooth-ai-criminal-drives-first-end-to-end-agentic-ransomware-attack/5266073">The Register</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>70% разработчиков считают ИИ-код дырявым, при этом 30% всех опрошенных деплоят его в прод</title>
      <link>https://tproger.ru/articles/70-razrabotchikov-uvereny-ii-kod-dyryavyj-no-30-vsyo-ravno-depl</link>
      <comments>https://tproger.ru/articles/70-razrabotchikov-uvereny-ii-kod-dyryavyj-no-30-vsyo-ravno-depl?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/70-razrabotchikov-uvereny-ii-kod-dyryavyj-no-30-vsyo-ravno-depl</guid>
      <description><![CDATA[<p>93% компаний взламывали из-за уязвимого ИИ-кода. Разбираем исследование Checkmarx и объясняем, почему разработчики деплоят баги в прод. Читайте выводы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/70-razrabotchikov-uvereny-ii-kod-dyryavyj-no-30-vsyo-ravno-depl">70% разработчиков считают ИИ-код дырявым, при этом 30% всех опрошенных деплоят его в прод</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Jun 2026 10:06:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы думаете, что ИИ пишет код лучше вас — пересмотрите свои ожидания. 70% разработчиков убеждены: код, сгенерированный нейросетями, содержит <b>больше уязвимостей</b>, чем человеческий. Ещё более шокирующая цифра — <b>30% всех опрошенных</b> признаются, что <b>сознательно деплоят</b> этот дырявый код в продакшен.</p><p>Таковы результаты ежегодного исследования компании <a href="https://checkmarx.com/">Checkmarx</a> — вендора инструментов для анализа безопасности приложений. В опросе участвовали 2350 разработчиков, CISO (Chief Information Security Officer) и AppSec-менеджеров (application security) по всему миру. Выборка выросла на 54% по сравнению с прошлым годом, что делает данные ещё более репрезентативными.</p><p>70% разработчиков считают ИИ-код более уязвимым, чем человеческий.</p><p>30% всех опрошенных сознательно деплоят уязвимый код в продакшен.</p><p>93% компаний пережили хотя бы один инцидент безопасности из-за уязвимых приложений.</p><p>Организации, где 81–100% кода генерируется ИИ, деплоят уязвимости в 3,4 раза чаще, чем те, где ИИ-генерация составляет 1–20%.</p><p>59% кода в продакшене — open source, который тоже не идеален с точки зрения безопасности.</p><h2>ИИ пишет половину кода — и это проблема</h2><p>По данным Checkmarx, сегодня примерно <b>49% кода</b> в продакшене создаётся с помощью ИИ. Это немного меньше, чем 54% в прошлом году, но всё ещё колоссальная цифра. Почти каждая вторая строка в вашем приложении может быть рождена нейросетью, которая обучалась на публичных репозиториях — со всеми их багами, устаревшими паттернами и скрытыми уязвимостями.</p><p>Причина проста: языковые модели обучаются на огромных массивах существующего кода, включая устаревшие практики и известные CVE (Common Vulnerabilities and Exposures). Исследователи из <a href="https://www.ucf.edu/">University of Central Florida</a> и <a href="https://www.birzeit.edu/">Birzeit University</a> в 2025 году провели сравнительный анализ безопасности кода, сгенерированного разными LLM для Java, Python, C и C++. <b>C-код оказался самым дырявым</b>, Python — относительно чистым. Но ключевой вывод исследования шире: модели «недоиспользуют современные языковые и компиляторные возможности, предпочитая устаревшие практики более безопасным альтернативам». Сами исследователи оговаривают: LLM эволюционируют быстро, и их выводы — это «снимок во времени» (time-stamped view), а не вечная истина.</p><h2>Почему разработчики деплоят то, что не доверяют</h2><p>Вот в чём парадокс: разработчики <b>видят</b> проблему, но <b>не чувствуют</b> ответственности за её решение. Основные причины, по которым уязвимый код попадает в прод, выглядят так:</p><ul><li>Давление сроков и необходимость быстро деплоить фичи.</li><li>Уязвимости слишком сложно или дорого исправлять постфактум.</li><li>Надежда на то, что «другие инструменты безопасности подхватят» на поздних этапах.</li><li>Нормализация риска: когда все вокруг деплоят с багами, это перестаёт восприниматься как катастрофа.</li></ul><p>Checkmarx прямо констатирует: <b>«Risk is normalized»</b> — риск стал нормой. 93% респондентов сообщили о как минимум одной бреши в безопасности, связанном с уязвимыми приложениями. В прошлом году это было 98% — статистика чуть улучшилась, но не кардинально. Когда девять из десяти компаний регулярно взламывают, инцидент перестаёт быть новостью и становится рутиной.</p><blockquote>Объём ИИ-кода напрямую коррелирует с частотой деплоя уязвимого кода, которая, в свою очередь, коррелирует с частотой инцидентов безопасности.</blockquote><p>Самая тревожная цифра: организации, где <b>81–100% кода</b> генерируется ИИ, деплоят уязвимый код в <b>3,4 раза чаще</b>, чем компании с умеренным использованием ИИ (1–20%). Это прямая корреляция: чем выше доля ИИ-генерации, тем чаще в прод попадают уязвимости. Причина не только в самом коде, но и в том, что высокая скорость разработки часто сопровождается слабыми процессами безопасности.</p><h2>Open source как фундамент — и фундамент трещит</h2><p>Ещё один слой проблемы — open source. По оценкам респондентов, <b>59% кода</b> в продакшене приходится на открытые библиотеки. Это самооценки, но они отражают реальность: современный проект без node_modules, requirements.txt или Cargo.toml немыслим. Проблема в том, что мейнтейнеры этих библиотек часто не успевают закрывать уязвимости, а злоумышленники активно внедряют вредоносные пакеты в npm, PyPI и другие репозитории.</p><p>ИИ-инструменты ускоряют разработку, но не ускоряют аудит безопасности. Veracode в своём отчёте предупреждает: <b>скорость ИИ-разработки делает безопасность недостижимой</b>, если процессы не перестраиваются соответствующим образом. Инструменты статического анализа и сканеры на базе ИИ уязвимостей существуют, но организации не умеют встраивать их в процесс. «Инструменты делают работу, но компании не умеют переводить это в процесс» — констатируют в Checkmarx.</p><p>Например, вот типичная разница между ИИ-сгенерированным кодом и безопасной альтернативой. Copilot или аналогичные инструменты часто предлагают устаревший pickle.load для десериализации данных:</p><p>pickle.load выполняет произвольный Python-код при десериализации — классическая уязвимость из списка <a href="https://owasp.org/">OWASP Top 10</a>. Аналогичные проблемы часто встречаются в SQL-запросах без параметризации, использовании eval() и устаревших криптографических функциях. Проверяйте каждый snippet перед мержем.</p><h2>Как не превратить ИИ-ускорение в ИИ-катастрофу</h2><p>Отказываться от ИИ в разработке бессмысленно — это уже не инструмент будущего, а повседневная реальность. Но можно и нужно менять подход:</p><ol><li>Проверяйте ИИ-код так же тщательно, как человеческий. Не предполагайте, что нейросеть знает лучше.</li><li>Автоматизируйте сканирование уязвимостей в CI/CD. SAST (Static Application Security Testing) и DAST (Dynamic Application Security Testing) должны быть обязательным шагом пайплайна, а не опцией.</li><li>Аудитируйте зависимости. Используйте инструменты вроде npm audit, Snyk или OWASP Dependency-Check.</li><li>Обучайте команду безопасности. Разработчики должны понимать, какие уязвимости чаще всего генерирует ИИ для вашего стека.</li><li>Не жертвуйте безопасностью ради скорости. Если уязвимость критична — отложите релиз. Технический долг в безопасности обходится в разы дороже, чем в производительности.</li></ol><h2>Выводы</h2><p>ИИ — это не замена разработчику, а ускоритель. Как любой ускоритель, он требует тормозов. Когда 30% всех опрошенных сознательно деплоят код, в котором сами признают уязвимости, проблема не в технологиях — а в отсутствии дисциплины. Не верьте нейросети на слово: проверяйте зависимости, сканируйте код, требуйте ревью. Ускорение без контроля — это не оптимизация, а авария в замедленной съёмке.</p><p><b>Источник:</b> <a href="https://www.theregister.com/devops/2026/06/09/devs-know-ai-code-is-riddled-with-holes-but-ship-it-anyway/5252824">The Register — Devs know AI code is riddled with holes, but ship it anyway</a></p>]]></content:encoded>
    </item>
    <item>
      <title>5 правил профессионального вайбкодинга, которые делают работу безопаснее и надёжнее на 90%</title>
      <link>https://tproger.ru/articles/5-pravil-professionalnogo-vajbkodinga-kotorye-delayut-rabotu-be</link>
      <comments>https://tproger.ru/articles/5-pravil-professionalnogo-vajbkodinga-kotorye-delayut-rabotu-be?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Сербул]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-pravil-professionalnogo-vajbkodinga-kotorye-delayut-rabotu-be</guid>
      <description><![CDATA[<p>Александр Сербул, руководитель больших данных, высоконагруженных систем и машинного обучения Битрикс24, про правила профессионального вайбкодинга</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-pravil-professionalnogo-vajbkodinga-kotorye-delayut-rabotu-be">5 правил профессионального вайбкодинга, которые делают работу безопаснее и надёжнее на 90%</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 13 May 2026 04:37:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Программирование с нейросетями упрощает работу разработчикам, а людям без технического опыта дает возможность создавать программы, не тратя месяцы и годы на обучение.</p><p>Но пока что искусственный интеллект работает не идеально и может допускать ошибки и уязвимости. Чтобы увеличить надёжность результатов работы ИИ, есть несколько правил. Применять их можно даже без опыта разработки, достаточно использовать те же ИИ-инструменты. Что это за правила, рассказывает руководитель больших данных, высоконагруженных систем и машинного обучения Битрикс24 Александр Сербул.</p><h2>Когда вайбкодинг — это риск</h2><p>Искусственный интеллект позволяет нам писать код на любом языке: описать желаемую цель простым языком и получить работающий результат. Это потрясающая возможность. Но при этом нужно помнить ограничения этой технологии.</p><p>Нейросеть — это инструмент, который работает только внутри процесса разработки, а не вместо него. Изначально вайбкодинг был инструментом для создания прототипов и MVP — первых версий продукта с минимальными возможностями.</p><p>Создатель AI-агента Open Claw Питер Штайнбергер говорит: «<a href="https://www.businessinsider.com/openclaw-creator-vibe-coding-term-slur-criticism-2026-2" rel="nofollow">Вайбкодинг — это навык</a>, который прокачивается». Это значит, что использовать публично и в открытом доступе под нагрузками для критически важных процессов написанный ИИ код можно только при полном понимании того, как он работает.</p><p>Если полностью доверять созданному машиной коду, есть риск запустить плохо работающие или небезопасные приложения. Поэтому при ИИ-программировании нужно разумно задавать ограничения, которые снимут большинство проблем. Эти ограничения можно разделить на 5 шагов, но работают они не по отдельности, а как единый процесс.</p><h2>Правило 1: выбираем строго типизированный язык</h2><p>Программа работает с разными типами данных: числами, строками, логическими значениями.</p><p>Некоторые языки программирования более гибкие, например PHP, Python или JavaScript. В них можно менять типы данных по ходу работы программы — это может быть удобно разработчику, но для ИИ повышается вероятность допустить ошибку. Другой вариант — <a href="https://learn.microsoft.com/ru-ru/windows/win32/rpc/strong-typing" rel="nofollow">типизированные языки</a>, которые заставляют разработчика сразу указывать, какие типы данных где находятся: TypeScript, Java, Kotlin, Rust. Человеку с таким языком работать труднее, но нейросети их понимают хорошо, и количество ошибок нейросети резко снижается.</p><p>Для гибких языков программирования решение тоже есть: можно добавить дополнительные аннотации типов и проверки-валидаторы типов данных. Пример такого валидатора — MyPy для Python.</p><p>В работе это будет выглядеть так: нам нужна функция, которая должна складывать числа, но нейросеть случайно передаёт туда строку. Без проверки это приведёт к ошибке уже во время работы. С типизацией система сразу скажет: «Сюда можно передавать только числа».</p><p>Поэтому первое правило для профессионального вайбкодинга: выбирать строго типизированный язык или добавлять валидаторы типов данных.</p><h2>Правило 2: включаем базовую проверку с помощью линтеров</h2><p>Линтеры — это инструменты, которые автоматически проверяют код: стиль, потенциальные ошибки и уязвимости. Они помогают сделать код проще и понятнее, а значит — снизить вероятность ошибок.</p><p>Написать работающую программу можно по-разному. Одним из важных навыков для программиста считается писать понятный код. Это важно не только при работе в команде, но и при одиночной разработке: программа должна оставаться понятной, если вы открываете её через месяц или полгода. Именно поэтому годами создаются правила стиля в программировании, которые помогают писать понятный людям код.</p><p>Плохой стиль программирования не всегда вызывает прямые ошибки, но работать с ней неудобно. Например, переменные названы непонятно, а условия записаны сложно. Программа работает, но другому разработчику будет трудно понять, что происходит. Линтер проверит код и подскажет, где его упростить и привести к стандартному виду.</p><p>Поэтому берем за правило всегда добавлять линтеры для базовой проверки.</p><h2>Правило 3: пишем тесты</h2><p>Есть ещё одна проблема, которую <a href="https://ru.wikipedia.org/wiki/Проблема_остановки" rel="nofollow">в 1936 году сформулировал</a> британский математик Алан Тьюринг. Её смысл в том, что невозможно написать программу, которая гарантированно определит корректность другой программы.</p><p>Хотя полностью быть уверенным в правильной работе компьютерной системы нельзя, некоторые конкретные случаи проверить всё-таки можно. Для проверки этих случаев пишут другие программы — тесты. Они сильно снижают количество возможных ошибок, и нейросети хорошо справляются с созданием таких проверочных программ.</p><p>Важно просить ИИ-агентов закладывать в систему тесты на всех уровнях. Некоторые тесты проверяют отдельные небольшие фрагменты кода. Другие проверяют работу целиком или только основной сценарий, когда программа запускается и в общем работает как ожидается. Тесты должны быть автоматическими, чтобы разработчик не тратил несколько часов на их запуск после каждого обновления программы.</p><p>Правило номер три: добавляем в запросы к нейросети создание тестов, которые должны запускаться при любом изменении кода. Это строгое правило, которое является частью разработки.</p><h2>Правило 4: считаем тестовое покрытие</h2><p>Следующий шаг, который нужен для надёжного вайбкодинга: общее тестовое покрытие.</p><p>Покрытие показывает, какая часть приложения проверяется тестами. Иначе может оказаться так, что тесты есть, но значительную часть кода они не проверяют. Покрытие измеряется в процентах. Например, покрытие в 75% может означать, что тесты проверяют 750 строк из 1000.</p><p>Покрытие — это показатель не качества тестов, а того, насколько код вообще проверяется. Даже 100% покрытие не гарантирует отсутствие ошибок, но его отсутствие почти всегда означает, что часть системы вообще не проверяется.</p><p>Правило четвёртое: считайте процент тестового покрытия. Минимальный процент — 70-80% программы.</p><h2>Правило 5: проверяем входные данные, фреймворки и зависимости</h2><p>Есть ещё несколько дополнительных ограничений, которые делают систему более устойчивой.</p><p><b>Проверка входных данных.</b> Даже если код типизирован и покрыт тестами, в реальной работе он всё равно получает данные из внешнего мира — от пользователей, баз данных и других сервисов. Эти источники нельзя контролировать, и мы должны заранее предупредить нейросеть о том, что может поступить в программу.</p><p>Входные данные важно проверять, потому что они могут вызывать ошибки, поломки и даже приводить к уязвимостям в безопасности. Обязательно проверьте, что в промпте или передаваемой нейросети документации указано требование фильтровать входные параметры: типы, диапазоны значений и структуру данных. Иначе система будет работать только в идеальных сценариях и ломаться при поступлении неожиданных данных.</p><p><b>Минимальное количество фреймворков.</b> Чтобы разработка была проще и быстрее, программисты используют инструменты с готовыми фрагментами кода: библиотеки и фреймворки. С фреймворком одна команда может заменить несколько десятков строк кода.</p><p>Проблема в том, что фреймворк — это отдельная сложная программа, и почти к каждому есть сложная объёмная документация. Фреймворк — это сложная внешняя система со своей логикой и обновлениями. Чем больше фреймворков — тем сложнее поддержка и выше риск ошибок. Поэтому если задачу можно решить за 50-100 строк обычного кода, не нужно пытаться сократить их за счёт добавления фреймворка.</p><p><b>Контроль зависимостей.</b> Каждый дополнительный инструмент в программе будет новой зависимостью, потому что без него приложение не работает. Примеры зависимостей — <a href="https://thecode.media/framelibs/" rel="nofollow">библиотеки и фреймворки</a>.</p><p>Хотя переусложнять программу не стоит, но некоторые инструменты использовать можно и нужно. Например, некоторые фреймворки и библиотеки проверены годами и имеют большое количество пользователей и действительно делают приложения проще и удобнее. Поэтому лучшим вариантом будет использовать только то, что использовать необходимо и что сделает программу проще.</p><p>При этом зависимости нужно всё время контролировать: проверять, что используются актуальные версии, и что в них не обнаружено уязвимостей.</p><p>Чтобы упростить процесс такого контроля за продуктом, можно использовать специально подготовленные платформы для ИИ-разработки, вроде Битрикс24 VibeCode или Replit. Такие платформы работают по разному: выстраивают ограничения для агентов, другие сразу направляют ИИ для работы с конкретными технологиями. Ещё в них используются техники минимизации рисков: серверы с запущенными приложениями недоступны для атаки снаружи, а данные из приложений фильтруются через слой защищённого официального REST API.</p><p>Пятое правило: проверять входные данные, минимизировать количество фреймворков и постоянно обновлять зависимости и проверять их на уязвимости.</p><h2>Насколько надёжнее становится результат вайбкодинга</h2><p>Со всеми перечисленными правилами-этапами можно выстроить достаточно надёжный процесс. Соблюдая ограничения, нейросеть создаёт контролируемый, поддерживаемый и намного более безопасный код.</p><p>Лучше всего, если финальный продукт для публичного доступа, высоких нагрузок и использования в критически важных процессах проверяется профессиональным разработчиком, который разбирается во всех слоях программы. Именно поэтому важно использовать минимальное количество фреймворков и библиотек: в реальной работе код проверяется программистами, а найти специалиста с хорошим знанием 5-8 фреймворков довольно сложно.</p>]]></content:encoded>
    </item>
    <item>
      <title>Когда компилятор врёт: нарушение memory safety в safe-коде Go</title>
      <link>https://tproger.ru/translations/kogda-kompilyator-vryot-naruwenie-memory-safety-v-safe-kode-go</link>
      <comments>https://tproger.ru/translations/kogda-kompilyator-vryot-naruwenie-memory-safety-v-safe-kode-go?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kogda-kompilyator-vryot-naruwenie-memory-safety-v-safe-kode-go</guid>
      <description><![CDATA[<p>CVE-2026-27143 и CVE-2026-27144: два бага Go-компилятора ломали memory safety без unsafe, CGO и data races. Разбор механизма, примеры кода, исправление в Go 1.26.1.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kogda-kompilyator-vryot-naruwenie-memory-safety-v-safe-kode-go">Когда компилятор врёт: нарушение memory safety в safe-коде Go</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 08 Apr 2026 10:30:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы пишете на Go и считаете, что safe-код автоматически защищает от memory corruption — вот два реальных CVE, которые доказывают обратное: баги компилятора Go (исправлены в 1.26.1) позволяли получить control-flow hijack и повреждение памяти <em>без единого</em> unsafe, CGO, ассемблерной вставки и data race.</p><p>Исследователь Доминик Цёлек (<a href="https://ciolek.dev">ciolek.dev</a>) обнаружил два бага в цепочке компиляции Go и сообщил о них команде безопасности. Та ответила на первый отчёт через 3 минуты, на второй — через 4. Что показательно: git blame указал на самого исследователя как автора кода, в котором обнаружился баг, — он же сам написал его три года назад.</p><ul><li>CVE-2026-27143: переполнение int8-счётчика в цикле → prove pass удалял bounds check → инъекция инструкций</li><li>CVE-2026-27144: no-op-конверсия *p = T(*q) вместо *p = *q → компилятор пропускал careful copy path при пересечении памяти → memory corruption</li><li>Общая причина: «counterfeit certainty» — оптимизатор повышал «вероятно безопасно» до «доказано безопасно» слишком рано</li><li>Memory safety — свойство всей цепочки инструментов (frontend, optimizer, lowering, runtime, codegen), а не только языка</li><li>«Every optimization is a security claim» — каждая оптимизация компилятора является утверждением о безопасности</li></ul><h2>Баг 1 (CVE-2026-27143): переполнение счётчика цикла убирает bounds check</h2><p>Первый баг связан с фазой <em>prove pass</em> — проходом компилятора, который статически доказывает инварианты и на основании этого удаляет избыточные проверки. Идея хорошая: зачем проверять границы массива, если компилятор «знает», что индекс всегда находится в допустимом диапазоне?</p><p>Рассмотрим цикл с переменной типа int8, шагом 10 и лимитом 120:</p><p>На первый взгляд код безопасен: i не превышает 120, массив размером 200 байт — никакого выхода за границы. Prove pass рассуждал именно так: раз условие цикла гарантирует i ∈ [0, 120], bounds check можно удалить.</p><p>Но int8 хранит значения от -128 до 127. После 120 следующий шаг — 130, что переполняет тип и оборачивается в -126. Условие i &lt; 120 снова становится истинным, цикл продолжается, но уже с отрицательным индексом. Bounds check, который мог бы это поймать, компилятор уже выбросил — ведь он «доказал» безопасность. В результате происходит запись за пределы массива, что открывает возможность для control-flow hijack и инъекции инструкций.</p><blockquote>Prove pass повысил «индекс вероятно в пределах диапазона» до «индекс доказано в пределах диапазона», не учтя возможность целочисленного переполнения малых типов.</blockquote><h2>Баг 2 (CVE-2026-27144): no-op-конверсия и пересечение памяти</h2><p>Второй баг тоньше. Go использует «careful copy path» — специальный путь копирования данных при работе с пересекающимися областями памяти (overlapping memory). Без него можно записать в destination данные, которые уже были перезаписаны в процессе копирования из source.</p><p>Проблема возникала при казалось бы безобидной конструкции — no-op-конверсии типа при присваивании через указатель:</p><p>Конверсия T(*q) здесь не делает ничего содержательного — типы совпадают. Компилятор распознал её как no-op и оптимизировал… но при этом забыл переключиться на careful copy path. Если области памяти p и q пересекаются — данные копируются некорректно, что приводит к повреждению памяти.</p><p>Особенно опасным сценарием оказались slice values: заголовок слайса содержит указатель на данные, длину и ёмкость. При некорректном копировании заголовка указатель мог указывать на произвольную память, а длина — быть некорректной.</p><h2>Общая причина: «counterfeit certainty»</h2><p>Оба бага объединяет одна концептуальная проблема: компилятор принимал «вероятно безопасно» за «доказано безопасно» и на этом основании удалял защитные механизмы. Цёлек называет это <em>counterfeit certainty</em> — поддельная уверенность.</p><p>В первом случае prove pass «доказал» безопасность индекса, не учтя переполнение малых целых типов. Во втором случае оптимизатор «знал», что конверсия — no-op, и сделал из этого вывод, что careful copy path не нужен. В обоих случаях рассуждение было формально правильным, но неполным: не были рассмотрены все возможные состояния программы.</p><blockquote>Every optimization is a security claim. — Каждая оптимизация компилятора является утверждением о безопасности.</blockquote><p>Когда компилятор удаляет bounds check — он утверждает, что выход за границы невозможен. Когда он пропускает careful copy path — он утверждает, что пересечения памяти нет. Ошибка в этих утверждениях напрямую превращается в уязвимость безопасности.</p><h2>Memory safety — свойство всей цепочки инструментов</h2><p>Принято считать, что memory-safe языки (Go, Rust, Java, C#) гарантируют отсутствие memory corruption по определению. Это правда — в рамках спецификации языка. Но между спецификацией и работающей программой стоит компилятор.</p><p>Цепочка компиляции Go включает несколько фаз, каждая из которых делает предположения о корректности предыдущей:</p><ul><li>Frontend (парсинг, type checking) — проверяет синтаксис и типы</li><li>Optimizer (prove pass, escape analysis) — доказывает инварианты и устраняет лишние проверки</li><li>Lowering — преобразует высокоуровневые операции в машинно-зависимые</li><li>Runtime (garbage collector, goroutine scheduler) — управляет памятью во время выполнения</li><li>Codegen — генерирует итоговый машинный код</li></ul><p>CVE-2026-27143 затронул фазу optimizer, CVE-2026-27144 — фазу lowering. Обе уязвимости существовали несмотря на то, что исходный код был написан на «memory-safe» языке. Memory safety — это свойство, которое нужно обеспечивать на каждом уровне стека, не только на уровне языка.</p><h2>Go security team: ответ за 3–4 минуты</h2><p>Исследователь отправил отчёты об обоих багах в Go security team. Первый ответ пришёл через 3 минуты, второй — через 4. Оба бага были исправлены в Go 1.26.1. Сам Цёлек отметил, что процесс взаимодействия с командой был образцовым: быстрая реакция, прозрачная коммуникация и оперативный выпуск патча.</p><p>При разборе бага исследователь запустил git blame на подозрительный участок кода компилятора — и обнаружил собственное имя. Три года назад он сам написал этот код. По его словам, это добавило исследованию особой иронии и заставило более внимательно относиться к тому, что «очевидные» оптимизации несут в себе скрытые предположения о безопасности.</p><h2>Выводы</h2><p>История с CVE-2026-27143 и CVE-2026-27144 показывает: использование memory-safe языка — необходимое, но недостаточное условие для безопасности программы. Компилятор — не чёрный ящик с гарантиями, а сложная система с собственными инвариантами, которые могут нарушаться.</p><p>Оба бага существовали в «тихих» местах: оптимизаторе, который молча удалял проверки, и в lowering-фазе, которая молча пропускала защитный путь копирования. Ни один линтер, ни один статический анализатор не мог их обнаружить — ведь исходный код был совершенно корректным с точки зрения языка.</p><p>Практический вывод прост: обновляйтесь. Следите за <a href="https://groups.google.com/g/golang-announce">golang-announce</a>, обновляйтесь до новых версий Go сразу после выхода патчей безопасности, и помните, что «написано на Go» ≠ «memory-safe по определению».</p>]]></content:encoded>
    </item>
    <item>
      <title>Не доверяй — проверяй: создатель curl о безопасности open source</title>
      <link>https://tproger.ru/translations/ne-doveryaj---proveryaj--sozdatel-curl-o-bezopasnosti-open-source</link>
      <comments>https://tproger.ru/translations/ne-doveryaj---proveryaj--sozdatel-curl-o-bezopasnosti-open-source?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/ne-doveryaj---proveryaj--sozdatel-curl-o-bezopasnosti-open-source</guid>
      <description><![CDATA[<p>Как curl с десятками миллиардов установок защищается от supply-chain атак — 20+ мер верификации от запрета блобов до фаззинга. Проверьте свои зависимости.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/ne-doveryaj---proveryaj--sozdatel-curl-o-bezopasnosti-open-source">Не доверяй — проверяй: создатель curl о безопасности open source</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Apr 2026 03:33:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы уверены, что ваши зависимости — это именно то, что вы думаете? Даниэль Стенберг, создатель <a href="https://curl.se/">curl</a> и один из самых авторитетных разработчиков в мире open source, рассказывает, почему слепое доверие к софту — путь к катастрофе, и как curl выстраивает многоуровневую систему верификации, которая позволяет спать спокойно при десятках миллиардов установок.</p><p>curl — одна из самых распространённых программных библиотек в мире. В форме libcurl она работает на десятках миллиардов устройств. При таком масштабе любая компрометация может иметь катастрофические последствия.</p><p>— Каждый коммит и каждый релиз open-source проекта — потенциальная точка атаки: от внедрённого контрибьютора до взломанного CI</p><p>— curl применяет более 20 мер верификации: от запрета бинарных блобов и Unicode в коде до обязательного фаззинга и torture-тестов</p><p>— Внешние пользователи могут и должны верифицировать релизы: проверять подписи, сравнивать содержимое архивов с git-репозиторием</p><p>— Это не паранойя — это инженерная дисциплина, которая позволяет проекту оставаться надёжным уже 30 лет</p><p>— Стенберг призывает требовать такого же уровня верификации от всех зависимостей в вашем стеке</p><h2>Атаки на supply chain: 9 сценариев угроз</h2><p>Supply-chain атака — это компрометация не вашего кода, а кода ваших зависимостей: библиотек, инструментов сборки, CI-систем. С каждым коммитом и каждым релизом софта возникают риски. Даниэль Стенберг перечисляет сценарии, жертвой которых может стать широко используемый проект:</p><ul><li><b>Внедрённый контрибьютор</b> — как в случае с Jia Tan и xz-utils: внешне добросовестный участник команды, который намеренно маскирует вредоносный код под обычные коммиты</li><li><b>Скомпрометированный мейнтейнер</b> — авторизованный разработчик, чья учётная запись или машина взломаны. Его коммиты и релизы теперь содержат заражённый код</li><li><b>«Полезный» баг-фикс от незнакомца</b> — маленький шаг в длинной цепочке крошечных изменений, которые постепенно формируют уязвимость или бэкдор</li><li><b>Шантаж или давление</b> — существующего участника проекта принуждают вносить изменения, которые иначе были бы отклонены</li><li><b>Непреднамеренная ошибка</b> — добросовестный разработчик при добавлении фичи или исправлении бага случайно создаёт уязвимость</li><li><b>Подмена на уровне дистрибуции</b> — сайт, с которого раздаются тарболлы (архивы с исходным кодом для релиза), взломан; вместо оригинальных архивов раздаётся малварь</li><li><b>Компрометация учётных данных</b> — от имени известного участника проекта распространяется дезинформация через email, соцсети, блоги или даже дипфейк-видео</li><li><b>Атака через CI-инфраструктуру</b> — инструмент, используемый в CI и размещённый в облаке, взломан и исполняет вредоносный код</li><li><b>Поддельное зеркало</b> — пока основной git-репозиторий недоступен, кто-то предлагает «временное зеркало» с заражённым кодом</li></ul><p>Любой из этих сценариев может произойти в комбинации с другими и в быстрой последовательности.</p><h2>Верификация релизов: как пользователи могут проверить curl</h2><p>Люди спрашивают Стенберга, как он спит по ночам, учитывая масштаб curl и количество возможных атак.</p><blockquote>Есть только один способ бороться с этим видом бессонницы: делать всё возможное, и делать это открыто и прозрачно. Делать проект чуть лучше на этой неделе, чем на прошлой. Выстраивать инженерные процессы правильно. Предоставлять средства, чтобы каждый мог верифицировать то, что мы делаем и что мы выпускаем. Итерировать, итерировать, итерировать.</blockquote><p>Если хотя бы несколько независимых пользователей проверят, что релиз curl подписан мейнтейнером, а содержимое совпадает с тем, что есть в git-репозитории, — проект в хорошем состоянии. Достаточно нескольких независимых наблюдателей, чтобы любая аномалия была замечена.</p><p>Стенберг подчёркивает: он не знает, кто эти пользователи и существуют ли они вообще. Они <b>должны быть</b> полностью независимы от него и от проекта curl. Но проект предоставляет все инструменты и делает верификацию максимально простой.</p><h2>Безопасность curl изнутри: более 20 мер верификации</h2><p>Внешние наблюдатели могут подтвердить, что релизы соответствуют тому, что есть в git. Но обеспечить, чтобы в git попадал только безопасный и корректный код, — это внутренняя работа команды. Вот полный список мер:</p><h3>Стандарты кода и ограничения</h3><ul><li><b>Единый стиль кода</b> — нарушение стиля вызывает ошибку сборки. Это снижает риск случайных ошибок и упрощает ревью</li><li><b>Запрет «опасных» C-функций</b> — функции, которые легко использовать неправильно, запрещены. Их использование вызывает ошибку</li><li><b>Лимит на сложность функций</b> — если функция слишком сложна, это ошибка сборки. Код должен быть читаемым и понятным</li><li><b>Запрет бинарных блобов в git</b> — никаких способов спрятать зашифрованный вредоносный код. Попытка добавить блоб вызывает ошибку</li><li><b>Избегание base64-кодированных фрагментов</b> — ещё один способ обфускации, который curl активно исключает</li><li><b>Ограничение Unicode в коде и документации</b> — большинство использований Unicode запрещено, чтобы предотвратить homoglyph-атаки (подмену символов визуально похожими из другой кодировки, например кириллической «а» вместо латинской «a»)</li><li><b>Документирование всего</b> — код, API, поведение — всё задокументировано, чтобы не было сюрпризов. Документация тестируется, проверяется спеллчекером и проходит ревью наравне с кодом</li></ul><h3>Тестирование и непрерывная интеграция</h3><ul><li><b>Обязательное ревью каждого PR</b> — и людьми, и ботами. Коммиты ссылаются на исходный PR</li><li><b>Тысячи тестов</b> — для каждой функции. Поиск «белых пятен» в покрытии — приоритетная задача</li><li><b>Более 200 CI-джобов</b> — запускаются для каждого коммита и каждого PR. Без объяснённых провалов тестов мёрж невозможен</li><li><b>Максимально строгие опции компилятора</b> — все предупреждения трактуются как ошибки через -Werror. Ни одно предупреждение не остаётся без внимания</li><li><b>Valgrind и санитайзеры</b> — все тесты прогоняются через valgrind и несколько комбинаций санитайзеров для обнаружения проблем с памятью и неопределённого поведения (undefined behavior)</li><li><b>Torture-тесты</b> — каждый тест перезапускается так, чтобы каждый вызов функции, способной завершиться ошибкой, упал ровно один раз. Это гарантирует: curl не утекает памятью и не падает при любых сбоях</li><li><b>Непрерывный фаззинг</b> — автоматическое тестирование случайными входными данными для поиска крашей и уязвимостей. Работает без остановки в рамках <a href="https://google.github.io/oss-fuzz/">Google OSS-Fuzz</a> и кратко в CI для каждого коммита</li></ul><h3>Защита CI-инфраструктуры от компрометации</h3><ul><li><b>CI-джобы не пишут обратно в репозиторий</b> — доступ только на чтение. Даже при компрометации CI код не может быть заражён</li><li><b>Анализ конфигов CI</b> — инструменты вроде <a href="https://github.com/woodruffw/zizmor">zizmor</a> проверяют скрипты CI на уязвимости</li><li><b>Обязательная двухфакторная аутентификация</b> — для всех коммиттеров на GitHub</li></ul><h3>Политика безопасности и стабильность API</h3><ul><li><b>Уязвимости исправляются в следующем релизе</b> — без исключений. Проблемы безопасности не висят после того, как о них сообщили</li><li><b>Полная документация всех уязвимостей</b> — каждая когда-либо найденная уязвимость curl задокументирована со всеми деталями</li><li><b>Стабильность ABI и API</b> — curl никогда не ломает обратную совместимость (ABI — бинарный интерфейс приложения, API — программный интерфейс). Это позволяет пользователям легко обновляться до версий с исправленными уязвимостями вместо того, чтобы сидеть на устаревших</li><li><b>Независимые аудиты</b> — код curl неоднократно проверяли внешние эксперты по безопасности. Все найденные проблемы были немедленно устранены</li></ul><p>Всё это делается в открытую, с полной прозрачностью и отчётностью. Любой может наблюдать за процессом и проверять, что команда следует своим правилам.</p><h2>Не паранойя, а инженерная дисциплина</h2><p>Стенберг планирует на случай, когда кто-то <b>действительно</b> захочет и попытается навредить проекту и его пользователям. Или когда это произойдёт случайно. Успешная атака на curl теоретически может достичь миллиардов устройств.</p><blockquote>Это не паранойя. Эта система позволяет нам спокойно спать по ночам. Именно поэтому пользователи до сих пор полагаются на curl спустя тридцать лет разработки.</blockquote><p>Недавно Стенберг добавил на сайт curl отдельную страницу верификации, где подробно описано, как проверить целостность релизов.</p><h2>Безопасность зависимостей: что проверить в вашем проекте</h2><p>Стенберг призывает: <b>требуйте такого уровня верификации от всех зависимостей в вашем стеке</b>. Вот конкретные шаги, которые вы можете предпринять уже сейчас:</p><h3>Проверка подписей и целостности пакетов</h3><p>Большинство пакетных менеджеров умеют проверять подписи. Убедитесь, что эта проверка включена:</p><h3>Аудит зависимостей в CI</h3><p>Встройте проверку уязвимостей в ваш CI-пайплайн:</p><p>Базы уязвимостей <a href="https://osv.dev/">OSV</a> и <a href="https://nvd.nist.gov/">NVD</a> — основные источники данных для этих инструментов.</p><h3>Оценка практик ваших зависимостей</h3><p>Прежде чем добавить зависимость, проверьте:</p><ul><li>Есть ли у проекта обязательное ревью PR? Посмотрите историю мёржей</li><li>Есть ли CI с тестами? Проверьте бейджи в README и конфиги в .github/workflows/</li><li>Как быстро закрываются уязвимости? Проверьте security advisories на GitHub</li><li>Сколько активных мейнтейнеров? Один человек — точка отказа</li><li>Используется ли <a href="https://openssf.org/projects/scorecard/">OpenSSF Scorecard</a> — автоматическая оценка безопасности open-source проекта</li></ul><h2>Выводы: доверяйте коду, а не репутации</h2><p>Опыт curl показывает: безопасность open source — это не вопрос доверия, а вопрос <b>верификации</b>. За 30 лет разработки проект выстроил систему из более чем 20 конкретных мер — от запрета бинарных блобов до непрерывного фаззинга — которые вместе создают многоуровневую защиту.</p><p>Если проект с десятками миллиардов установок может работать полностью открыто и предоставлять инструменты верификации для каждого, то и другие проекты обязаны стремиться к тому же стандарту. Начните с малого: npm audit signatures, pip-audit, проверка security advisories ваших зависимостей.</p><p><b>Не доверяйте — проверяйте.</b></p><p><i>Источник: <a href="https://daniel.haxx.se/blog/2026/03/26/dont-trust-verify/">Don't trust, verify</a> — блог Даниэля Стенберга</i></p>]]></content:encoded>
    </item>
    <item>
      <title>C++26 завершён — самый значимый релиз со времён C++11 с рефлексией и безопасностью памяти</title>
      <link>https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi</link>
      <comments>https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi</guid>
      <description><![CDATA[<p>Комитет ISO завершил C++26 — самый важный релиз со времён C++11. Рефлексия, hardened stdlib, контракты и std::execution. Узнайте, что изменится при перекомпиляции.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi">C++26 завершён — самый значимый релиз со времён C++11 с рефлексией и безопасностью памяти</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Mar 2026 02:27:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Комитет ISO <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">завершил</a> техническую работу над C++26. По масштабу изменений — рефлексия, безопасность памяти, контракты, std::execution — это самый значимый релиз со времён C++11.</p><p>В субботу, 29 марта, около 210 экспертов из 24 стран — 130 очно и 80 удалённо — разрешили оставшиеся международные комментарии на встрече в Лондоне (Кройдон, Великобритания). Документ отправляется на финальное голосование ISO (DIS — Draft International Standard) и будет опубликован в ближайшее время.</p><p>— C++26 завершён — самый значимый релиз со времён C++11</p><p>— Четыре главные фичи: рефлексия, безопасность памяти, контракты, std::execution</p><p>— Рефлексия позволяет C++ инспектировать и генерировать собственный код на этапе компиляции</p><p>— Hardened stdlib уже развёрнута в Google (1000+ багов исправлено, segfault-ы −30%) и Apple с оверхедом 0,3%</p><p>— GCC уже имеет рефлексию и контракты в trunk — можно пробовать сейчас</p><p>— Работа над C++29 стартует в июне с фокусом на дальнейшую безопасность памяти</p><h2>Четыре главные фичи C++26</h2><p>Херб Саттер, почётный председатель комитета ISO C++ (chair emeritus с 2025 года), <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">называет</a> их «Fab Four» — четвёрка фич, которые делают C++26 прорывным релизом.</p><h3>1. Рефлексия — крупнейшее обновление со времён шаблонов</h3><p>Compile-time рефлексия позволяет C++ описывать самого себя и генерировать код на этапе компиляции. Оператор <b>^</b> (reflection operator) превращает сущность в её метаданные, а шаблонные функции из пространства <b>std::meta</b> позволяют работать с ними:</p><p>По словам Саттера, это «самый мощный новый движок для выражения эффективных абстракций за всю историю C++». Рефлексия <a href="https://herbsutter.com/2025/06/">попала</a> в драфт C++26 ещё в июне 2025 года.</p><h3>2. Меньше UB — больше безопасности памяти</h3><p>C++26 делает существующий код безопаснее <b>просто при перекомпиляции</b>, без изменений в исходниках. UB (undefined behavior, неопределённое поведение) — исторически главный источник уязвимостей в C++. Два ключевых улучшения:</p><ul><li><b>Чтение неинициализированных переменных больше не UB.</b> Целая категория уязвимостей исчезает при переходе на C++26</li><li><b>Hardened стандартная библиотека</b> — автоматические проверки границ при обращении к элементам vector, span, string, string_view и десятков других типов. При выходе за границы — trap вместо тихого повреждения памяти</li></ul><p>Это не теоретический дизайн. В Google hardened stdlib уже <a href="https://dl.acm.org/doi/10.1145/3712171">развёрнута</a> на сотнях миллионов строк C++: исправлено более 1000 багов, прогноз — предотвращение 1000–2000 багов в год, segfault-ы по всему production-флоту снизились на 30%. В Apple — аналогичный масштаб. Средние накладные расходы — всего 0,3% производительности.</p><blockquote>Из сотен миллионов строк C++ в Google только пять сервисов полностью отказались от hardening из-за проблем с производительностью. Гранулярный API для небезопасного доступа использовался всего в семи местах.</blockquote><h3>3. Контракты: pre, post, contract_assert</h3><p>Языковые контракты позволяют задавать предусловия, постусловия и утверждения прямо в объявлениях функций — вместо хрупкого макроса <b>assert</b> из C, который не знает ни о параметрах, ни о возвращаемых значениях:</p><p>Фича вызвала серьёзные дебаты. Часть комитета считает, что текущий дизайн контрактов недостаточно продуман — в частности, спорным остаётся поведение при нарушении контракта (вызов хендлера vs немедленный terminate). На финальном голосовании 114 экспертов проголосовали за, 12 — против, 3 воздержались. Рекордно низкое число воздержавшихся показывает, что все определились с позицией.</p><h3>4. std::execution — асинхронная модель C++</h3><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html">std::execution</a> (Sender/Receiver) предоставляет унифицированный фреймворк для конкурентности и параллелизма. В отличие от <b>std::async</b> и сырых потоков, фреймворк обеспечивает <b>структурированную конкурентность</b> — код свободен от гонок данных по конструкции.</p><p>Саттер предупреждает: фича мощная (его компания <a href="https://www.citadelsecurities.com/">Citadel Securities</a> уже использует её в production), но пока её сложнее освоить, чем большинство фич C++ — не хватает документации и вспомогательных библиотек.</p><h2>Быстрое внедрение</h2><p>Саттер ожидает, что C++26 будет внедряться значительно быстрее, чем C++17/20/23. Две причины:</p><ol><li><b>Экстраординарный спрос.</b> Рефлексия нужна всем, кто пишет сериализацию, ORM, конфигурации, логирование. Hardened stdlib даёт безопасность бесплатно. В отличие от нишевых фич C++20 (концепты, модули), здесь каждый C++-разработчик найдёт применение в своём коде</li><li><b>Компиляторы уже готовы.</b> На протяжении разработки C++26 и GCC, и Clang уже реализовали две трети фич. GCC уже имеет рефлексию и контракты в trunk — можно пробовать прямо сейчас</li></ol><h2>Как попробовать C++26 уже сейчас</h2><p>Рефлексию и контракты можно попробовать в <a href="https://compiler-explorer.com/">Compiler Explorer</a> (godbolt.org), выбрав GCC trunk с флагом <b>-std=c++26 -freflection</b>. Hardened stdlib в libstdc++ активируется флагами:</p><h2>C++29: ещё больше безопасности</h2><p>На встрече приняли расписание C++29 (следующий трёхлетний цикл). Главный фокус — дальнейшее усиление безопасности памяти, в том числе <a href="https://isocpp.org/std/the-committee">профили безопасности</a> Бьёрна Страуструпа.</p><p>Особенно примечателен доклад Оливера Ханта из Apple (P4158R0): WebKit <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">захардинил</a> более 4 миллионов строк кода подходом «подмножество надмножества» (аналогично Profiles). Результат: закрыты целые классы уязвимостей, политики предотвратили бы большинство исторических эксплойтов.</p><p>Следующие встречи комитета — в Брно (Чехия) в июне и в Бузиос (Рио-де-Жанейро, Бразилия) в ноябре, где начнётся работа над фичами C++29.</p><h2>Выводы</h2><p>C++26 — начало фундаментально новой эры: C++ становится безопаснее по умолчанию, оставаясь верным принципу zero-overhead. Рефлексия даёт инструмент, который заменит тонны макросов и кодогенераторов. Hardened stdlib уже доказала свою эффективность на сотнях миллионов строк кода в Google и Apple.</p><p>Подробный отчёт со встречи — в <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">блоге Херба Саттера</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как отлавливать BYOVD-атаки: чек-лист детектирования с примерами</title>
      <link>https://tproger.ru/articles/kak-otlavlivat-byovd-ataki--chek-list-detektirovaniya-s-primerami</link>
      <comments>https://tproger.ru/articles/kak-otlavlivat-byovd-ataki--chek-list-detektirovaniya-s-primerami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Константин Рисков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-otlavlivat-byovd-ataki--chek-list-detektirovaniya-s-primerami</guid>
      <description><![CDATA[<p>Разбираем технику BYOVD — как злоумышленники обходят EDR через уязвимые драйверы ядра. Реальные кейсы Lazarus, RansomHub и BlackByte, готовые правила корреляции для SIEM KUMA и чек-лист защиты: HVCI, LOLDrivers, heartbeat-мониторинг агентов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-otlavlivat-byovd-ataki--chek-list-detektirovaniya-s-primerami">Как отлавливать BYOVD-атаки: чек-лист детектирования с примерами</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 13 Mar 2026 06:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>EDR — Endpoint Detection and Response (EDR) — технология кибербезопасности для мониторинга, обнаружения и реагирования на угрозы на конечных устройствах (рабочие ноутбуки, серверы, смартфоны сотрудников). Это ПО непрерывно собирает данные о процессах, взаимодействии с реестром, запуске программ, файлов, сетевых подключениях на устройствах и если, допустим, некий процесс выглядит подозрительно, система не только бьёт тревогу, но и нейтрализует опасность, например, изолирует устройство от сети или откатывает изменений.</p><p>EDR — это очень мощное ПО. Можно сказать, что это основа современной безопасности.</p><p>Но есть такая техника, при которой EDR лежит кверху лапками, как безобидный щеночек, а не как сторожевой пес размером с трактор. Эта техника называется BYOVD (Bring Your Own Vulnerable Driver), посредством которой злоумышленники проникают в систему, повышают привилегии и потом делают то, что им нужно.</p><p>В статье разберу чем опасны BYOVD-атаки и поделюсь готовыми правилами детектирования, которые можно распечатать и всегда держать под рукой.</p><h2>Теоретическая часть: как работает BYOVD-атака</h2><p>BYOVD очень опасная техника.</p><ul><li>Программы-вымогатели BlackByte и AvosLocker использовали BYOVD для обхода средств защиты.</li><li>По данным <a href="https://www.huntress.com/blog/top-3-cybersecurity-threats-of-2024-so-far-what-you-need-to-know">Huntress</a>, в 2024 году значительная доля атак шифровальщиков включала обход EDR — в том числе через уязвимые драйверы.</li><li>BYOVD — типовая фаза ransomware-операций, а ransomware — главная киберугроза для российского бизнеса. В 2024 году шифровальщики парализовали СДЭК на трое суток (300 тыс. посылок в день), положили платёжные терминалы сети «Верный» по всей стране (убытки 120–140 млн руб./день), а в июле 2025-го хакеры уничтожили ИТ-инфраструктуру «Аэрофлота», вынудив отменить более 100 рейсов. Во всех этих инцидентах ключевым этапом было отключение защиты — и именно BYOVD остаётся самой распространённой техникой для этого. По данным Symantec, в 2026 году BYOVD стал наиболее частым методом обхода EDR в ransomware-атаках.</li><li>BYOVD — обязательный компонент в кибершпионаже. К слову, в процессе знаменитой масштабной операции по кибершпионажу, называемой <a href="https://attack.mitre.org/campaigns/C0022/">Operation DreamJob</a>, проводимой группировкой Lazarus, использовался BYOVD. Группировка создавала фейковые профили рекрутеров в LinkedIn и рассылала жертвам «вакансии» — ISO-файлы с вредоносной начинкой: многоступенчатой цепочкой загрузчиков (RollFling → RollSling → RollMid → KaolinRAT), финальным звеном которой был FudModule — руткит, работающий на уровне ядра.</li></ul><p>Практически во всех крупных ransomware-инцидентах ключевой этап — отключение EDR перед шифрованием. Если описать BYOVD в двух словах, то Bring Your Own Vulnerable Driver (BYOVD) — это техника, при которой злоумышленник использует уязвимость Windows, чтобы обойти EDR и получить привилегированный доступ к системе.</p><p>Дело в том, что Windows делит весь исполняемый код на два уровня доверия — в архитектуре x86 они называются кольцами защиты (protection rings): Ring 3 пользовательский режим, и Ring 0 режим ядра.</p><p>Обычные программы, вроде браузера, работают в Ring 3 и имеют ограниченный набор привилегий. А в ядре (Ring 0) работают ntoskrnl.exe (само ядро), HAL, файловая система, сетевой стек и все драйверы. А имея доступ к Ring 0 можно модифицировать любые структуры данных, завершать любые процессы и отключать любую телеметрию, что и делают BYOVD программы.</p><p>Доступ к Ring 0 можно получить посредством драйвера, потому что драйверы в Windows работают в ring 0 — то есть на уровне ядра, с максимальными привилегиями. Чтобы обезопасить ядро от нелегитимных пользователей, Microsoft ввёл обязательную подпись драйверов (DSE — Driver Signature Enforcement) и в теории, загрузить произвольный код в ядро нельзя — драйвер должен быть подписан сертификатом, которому доверяет Microsoft.</p><p>На деле в BYOVD-атаках используются именно легитимные подписанные драйверы, потому что Windows не проверяет списки отзыва сертификатов (CRL) при загрузке драйверов — на этом этапе загрузки ОС сеть ещё недоступна. Например, в феврале 2026 года Huntress <a href="https://anonhaven.com/news/drajver-encase-2006-goda-stal-oruzhiem-hakerov-ataka-byovd-otklyuchaet-59-sredstv-zashity/?utm_source=chatgpt.com">обнаружил</a> атаку, где 20-летний драйвер EnCase (драйвер EnCase подписан сертификатом от 15 декабря 2006 года) с отозванным сертификатом мог убивать 59 EDR-процессов.</p><p>EDR — это такой гибрид, у которого пользовательский интерфейс работает в Ring 3, а для мониторинга он устанавливает свой kernel-mode драйвер в Ring 0. Мониторинг EDR основан на kernel callbacks — специальных функциях- уведомлениях, которые ядро вызывает при определённых событиях, например, когда создаётся процесс — срабатывает PsSetCreateProcessNotifyRoutine, а когда загружается DLL — PsSetLoadImageNotifyRoutine.</p><p>Коллбэки регистрируются EDR-драйвером при загрузке, и ядро хранит их адреса в служебных структурах — таких как CallbackListHead.</p><p>Помимо kernel callbacks, EDR перехватывает вызовы API-функций через function-hooking DLL, которая инжектируется в каждый процесс. Эти хуки работают в user mode и подменяют первые байты функций ntdll.dll (например, NtAllocateVirtualMemory) на переход в код EDR.</p><p>Поэтому даже после отключения kernel callbacks EDR может получать телеметрию через user-mode хуки — и наоборот. Продвинутые руткиты атакуют оба уровня одновременно.</p><p>Если атакующий получает возможность писать в память ядра, он может обнулить адреса коллбэков или флаги их активности — и ядро перестанет уведомлять EDR о любых событиях. Процесс антивируса при этом продолжает работать, но по факту ничего не видит. А дальше можно делать что угодно.</p><p>Microsoft поддерживает встроенный блок-лист уязвимых драйверов, но он покрывает лишь малую часть из сотен известных уязвимых драйверов в базе LOLDrivers.</p><p>Как так происходит? Есть три подхода к получению kernel-доступа, в том числе через BYOVD и смежные техники.</p><h3>Подход 1: N-day уязвимости в сторонних драйверах</h3><p>Атакующий берёт драйвер известного производителя (Dell, Intel, Realtek, MSI и десятки других) с уже обнаруженной уязвимостью. Драйвер подписан валидным сертификатом, DSE его пропускает. Через уязвимость (обычно это IOCTL, который позволяет произвольное чтение/запись физической или виртуальной памяти) атакующий получает примитивы для модификации ядра.</p><p>Примечание. Проект <a href="https://www.loldrivers.io/">LOLDrivers.io</a> на сегодня каталогизирует сотни таких драйверов.</p><p>Например, таким образом действовал инструмент FudModule группировки <a href="https://thehackernews.com/2024/04/north-koreas-lazarus-group-deploys-new.html?utm_source=chatgpt.com">Lazarus</a> (HIDDEN COBRA, APT38) — одной из самых технически продвинутых APT-группировок, связанных с КНДР. Первая версия FudModule (обнаружена ESET в 2022 году) эксплуатировала уязвимость CVE-2021-21551 в драйвере Dell dbutil_2_3.sys. Этот драйвер, предназначенный для обновления BIOS и firmware ноутбуков Dell, содержал критическую уязвимость: он принимал IOCTL-запросы, позволяющие читать и записывать произвольную физическую память без каких-либо проверок вызывающего процесса.</p><p>Для атакующего — находка: драйвер подписан Dell, Microsoft ему доверяет, а через IOCTL можно получить полный контроль над памятью ядра. Lazarus сбрасывали этот драйвер на диск, загружали через sc.exe create / sc.exe start и получали примитивы чтения/записи ядра.</p><h3>Подход 2: Злоупотребление PreviousMode</h3><p>Через эксплуатацию уязвимости атакующий меняет поле PreviousMode в структуре _KTHREAD текущего потока с UserMode (1) на KernelMode (0). После этого системные вызовы NtWriteVirtualMemory и NtReadVirtualMemory перестают проверять границы памяти и позволяют напрямую модифицировать пространство ядра из user mode.</p><figure><img src="https://media.tproger.ru/user-uploads/135405/2026-03-11/a7e5a017-d646-4920-b778-494f2a94c57d.webp" alt="" /><figcaption>[Схема: Архитектура Windows (User Mode ↔ Kernel Mode) и BYOVD-атака с отключением EDR через уязвимый драйвер]</figcaption></figure><h3>Подход 3: 0-day в компонентах Windows</h3><p>Более сложный путь: атакующий находит уязвимость в штатном драйвере операционной системы. Именно так <a href="https://xakep.ru/2024/03/04/cve-2024-21338-lazarus/">поступила</a> (опять же) группировка Lazarus с CVE- 2024-21338 в appid.sys (компонент AppLocker). В 2024 году группировка обновила FudModule до версии 2.0 и вместо стороннего драйвера Dell они нашли и проэксплуатировали 0-day уязвимость в appid.sys, штатном компоненте Windows, отвечающем за AppLocker.</p><p>Уязвимость имеет номер CVE-2024-21338 и её суть в том, что драйвер appid.sys содержал IOCTL, позволяющий вызвать произвольную функцию ядра с частичным контролем над первым аргументом. Для эксплуатации требовался LOCAL_SERVICE account — Lazarus получал его через имперсонацию.</p><p>Цепочка эксплуатации выглядела так:</p><ol><li>Имперсонация LOCAL_SERVICE через стандартные механизмы Windows.</li><li>Вызов уязвимого IOCTL в appid.sys для исполнения произвольной функции ядра.</li><li>Через полученный примитив — модификация поля PreviousMode в _KTHREAD текущего потока (с UserMode на KernelMode).</li><li>Теперь NtWriteVirtualMemory / NtReadVirtualMemory можно вызывать из user mode без проверки границ → полный R/W доступ к памяти ядра.</li></ol><p>Преимущество перед классическим BYOVD очевидно: не нужно сбрасывать файл на диск, не нужно загружать сторонний драйвер — appid.sys уже есть в каждой системе с включённым AppLocker. Это существенно снижает IoC и затрудняет детектирование.</p><h2>Публичные тулкиты: BYOVD для всех</h2><p>При этом BYOVD — это дешевый вид атаки — в 2024–2025 года готовые инструменты появились как грибы после дождя: на даркнет-форумах за несколько сотен долларов можно купить EDRKillShifter, AuKill, Blackout и прочее ПО для атак.</p><figure><img src="https://media.tproger.ru/user-uploads/135405/2026-03-11/f7229d67-9411-4a15-82ee-5c2292cd302c.webp" alt="" /></figure><p>И при этом нет нужды обладать глубокими знаниями ядра Windows, достаточно скачать готовый тулкит. Поэтому атаки стали повсеместными, что я продемонстрирую на примерах реальных кейсов последних двух лет.</p><h3>№1. BYOVD встраивается ВНУТРЬ ransomware</h3><p>В феврале 2026 года Symantec <a href="https://thehackernews.com/2026/02/reynolds-ransomware-embeds-byovd-driver.html">зафиксировал</a> новый паттерн: группировка Reynolds встроила уязвимый драйвер NSecKrnl прямо в payload шифровальщика. Раньше BYOVD-компонент и ransomware были отдельными файлами с временным зазором между ними — этот зазор давал SOC шанс среагировать. Теперь одного бинарника достаточно для отключения EDR и шифрования. По оценке Symantec, BYOVD стал самой частой техникой обхода защиты в ransomware-атаках 2026 года.</p><h3>№2. POORTRY: кастомный вредоносный драйвер</h3><p>Ещё интереснее POORTRY (<a href="https://infobezopasnost.ru/blog/news/medusa-ispolzuet-falshivye-drajvery-dlya-otklyucheniya-antivirusov/?yclid=6198236999571210239">Abyssworker</a>) — не уязвимый легитимный драйвер, а специально написанный вредоносный драйвер, к которому атакующие получили валидную подпись через украденные сертификаты WHCP. Он маскировался под антивирусный компонент (например, драйвер Malwarebytes) и использовался в атаках Medusa и Osiris.</p><h3>№3. RansomHub и EDRKillShifter</h3><p>Группировка RansomHub разработала собственный инструмент EDRKillShifter, эксплуатирующий уязвимый драйвер TrueSight.sys. Инструмент стал стандартным компонентом их ransomware-набора и использовался для отключения EDR перед развёртыванием шифровальщика. По данным исследователей, EDRKillShifter <a href="https://xakep.ru/2024/08/16/edrkillshifter/">применялся</a> в десятках инцидентов в 2024 году.</p><h3>№4. Kasseika: антивирусный драйвер против антивируса</h3><p>Группировка Kasseika использовала ироничный подход — уязвимый драйвер антивирусного продукта (Martini.sys от TG Soft’s VirIT) для отключения конкурирующих EDR-решений. Цепочка атаки: через PsExec распространялся загрузчик, который сбрасывал уязвимый антивирусный драйвер, загружал его и через IOCTL завершал процессы защитных решений. После этого развёртывался шифровальщик.</p><h3>№5. Deadlock: Baidu против безопасности</h3><p>В декабре 2025 года Cisco Talos задокументировал новый вариант вымогателя <a href="https://www.securitylab.ru/news/567079.php">Deadlock</a>, использующий уязвимый драйвер Baidu Antivirus (BdApiUtil.sys, CVE- 2024-51324).</p><p>Атакующие использовали лоадер EDRGay.exe, который сбрасывал драйвер под именем DriverGay.sys в директорию Videos жертвы. Через IOCTL 0x800024b4 лоадер вызывал ZwTerminateProcess() для завершения всех EDR-процессов. Уязвимость квалифицирована как Improper Privilege Management — непривилегированный пользователь мог завершить любой системный процесс.</p><h3>№6. BlackByte : систематический подход</h3><p>BlackByte продемонстрировал системный подход к BYOVD: группировка использовала несколько уязвимых драйверов в разных кампаниях, включая RTCore64.sys и драйверы из базы LOLDrivers. Особенность их подхода — интеграция BYOVD-компонента непосредственно в цепочку развёртывания ransomware, с автоматическим выбором драйвера в зависимости от целевой системы.</p><p>Список ransomware-групп, использующих BYOVD, продолжает расти: Qilin (драйверы Zemana и Toshiba), Akira (драйвер Intel), Play, BianLian, Medusa, Rhysida, Cuba, GhostLocker, INC, Interlock (GameDriverx64.sys, CVE-2025- 61155). BYOVD стал стандартной фазой операции ransomware.</p><h2>Разберём BYOVD-тулкит на примере Blackout</h2><p>С точки зрения детектирования публичные тулкиты — это одновременно проблема и возможность. Проблема в том, что порог входа для атакующего стал минимальным, а возможность, потому что их поведение предсказуемо и создаёт чёткие IoC: фиксированные хэши драйверов, характерные паттерны создания сервисов, списки процессов для убийства.</p><p>Большинство BYOVD-инструментов следуют одному паттерну: сбросить уязвимый драйвер на диск (часто в %TEMP% или %APPDATA%), создать и запустить сервис для его загрузки, через IOCTL получить примитив завершения произвольного процесса и последовательно убить все EDR/AV процессы по списку.</p><p>Разберем цепочку событий, которую генерирует типичная BYOVD-атака на примере публичного тулкита Blackout (ZeroMemoryEx) в тестовой среде (даже если атака не завершилась успехом)</p><p>Что такое Blackout? Это открытый инструмент на GitHub, реализующий классический паттерн BYOVD: сбросить на диск подписанный уязвимый драйвер, загрузить его через SCM (Service Control Manager) и через IOCTL-запрос завершить целевой процесс из Ring 0. Использование тривиально — достаточно указать PID жертвы:</p><p>Blackout.exe -p &lt;PID_процесса&gt;</p><p>Запуск в тестовой среде. Находим PID Sysmon и запускаем Blackout:</p><p>Blackout успешно создал сервис для загрузки kernel-драйвера,</p><figure><img src="https://media.tproger.ru/user-uploads/135405/2026-03-11/ab0fd1ab-daeb-4977-87cf-46b5c292145a.webp" alt="" /></figure><p>...но сам драйвер не загрузился, потому что сертификат подписи драйвера (GMEREK Systemy Komputerowe, Польша) отозван Microsoft и внесён в Certificate Trust List операционной системы:</p><p>Скриншот cs start — ошибка отзыва сертификата.</p><figure><img src="https://media.tproger.ru/user-uploads/135405/2026-03-11/14d9e896-2c52-4d48-8d9f-8c9591bdb0ad.webp" alt="" /></figure><p>Драйвер Blackout.sys подписан валидной цифровой подписью — но Microsoft, узнав об использовании этого драйвера в атаках, отозвал сертификат и добавил его хэш в системный блок-лист (Disallowed Certificate Store). Windows проверяет этот список при каждой загрузке драйвера — даже без доступа к интернету, потому что CTL вшит в ОС.</p><p>Это один из механизмов защиты от BYOVD, но с существенным ограничением: он работает только для уже известных драйверов. А база LOLDrivers.io содержит сотни уязвимых драйверов, и Microsoft физически не успевает отзывать все сертификаты. Поэтому атакующие просто берут менее известный драйвер — и блокировка не срабатывает.</p><p><b>Что увидит SOC</b>. Несмотря на неудачную загрузку, попытка атаки оставила чёткие следы в телеметрии:</p><p>Event ID 7045 (System log — Service Control Manager).</p><p>Это событие — ключевой индикатор. Создание нового сервиса с типом «драйвер режима ядра», где путь к файлу указывает за пределы System32\drivers\ — аномалия, которая должна вызывать алерт максимального приоритета.</p><figure><img src="https://media.tproger.ru/user-uploads/135405/2026-03-11/876e11f8-d045-4b67-8faa-e8f1df8b718c.webp" alt="" /></figure><p>Хэш драйвера (SHA256): 18C909A2B8C5E16821D6EF908F56881AA0ECCEEACCB5FA1E54995935FCFD1 2F7</p><figure><img src="https://media.tproger.ru/user-uploads/135405/2026-03-11/00025aba-e383-437b-9783-2662532be634.webp" alt="" /><figcaption>https://www.loldrivers.io/</figcaption></figure><p><br />Есть хорошие новости: каждый этап BYOVD оставляет следы — надо знать, куда смотреть. Давайте приступим к финальной части статьи — к выстраиванию эшелонированного детектирования, не привязанного к конкретной SIEM-платформе.</p><h2>Детектирование BYOVD: что и как мониторить</h2><p>Правила детектирования BYOVD делятся на два типа.</p><ul><li>Brittle-детекты — ловят конкретные IoC: хэш известного уязвимого драйвера, имя файла, путь. Они дают минимальный false positive, но обходятся простой заменой драйвера.</li><li>Robust-детекты — ловят поведение: цепочка «файл .sys → сервис → завершение EDR» сработает на любой неизвестный тулкит, но может дать ложные срабатывания на легитимную установку драйверов.</li></ul><p>Эшелонированная стратегия строится на комбинации обоих типов.</p><h2>Детект 1. Загрузка известного уязвимого драйвера</h2><p>MITRE ATT&amp;CK: T1068 (Exploitation for Privilege Escalation), T1562.001 (Impair Defenses: Disable or Modify Tools).</p><p>Самый базовый и эффективный детект — сопоставление хэшей загружаемых драйверов с базой <a href="https://www.loldrivers.io/">LOLDrivers.io</a>. Проект предоставляет актуальный список хэшей (SHA256, MD5, SHA1) всех известных уязвимых и вредоносных драйверов, а также готовые Sigma-правила.</p><p><b>Логика алерта</b>:</p><p>Событие: загрузка драйвера (Sysmon Event ID 6 или аналог). Условие: SHA256-хэш загруженного файла совпадает с записью в базе LOLDrivers. Severity: Critical.</p><p><br />Дополнительные индикаторы, усиливающие уверенность:</p><ul><li>Драйвер загружается из нетипичного расположения (%TEMP%, %APPDATA%, %USERPROFILE%, директория Downloads).</li><li>Имя драйвера не соответствует ожидаемому для данной системы (например, Dell dbutil на машине без оборудования Dell).</li><li>Драйвер сбрасывается на диск непосредственно перед загрузкой (создание файла + загрузка драйвера в окне &lt; 60 секунд).</li><li>LOLDrivers.io отдаёт готовые Sigma-правила и CSV с хэшами для импорта в SIEM — не нужно собирать вручную.</li></ul><p>Учти ограничение: хэш-детекты обходятся через CVE-2013-3900 (см. ниже).</p><h3>Ограничение хэш-детектов: CVE-2013-3900 и Authenticode padding</h3><p>Детект по SHA256 из LOLDrivers — необходимый минимум, но у него есть серьёзная слабость. CVE-2013-3900 — уязвимость в Windows Authenticode, которая позволяет менять байты в PE-файле за пределами подписанной области. Файловый хэш (SHA256) меняется, а подпись остаётся валидной. Windows загрузит такой драйвер без вопросов.</p><p>На практике это означает: атакующий берёт уязвимый драйвер из LOLDrivers, меняет пару байт — и получает файл, которого нет ни в одной хэш-базе. Check Point обнаружил более 2500 уникальных вариантов драйвера TrueSight.sys, созданных именно так: все с разными SHA256, все с одной подписью, все рабочие.</p><p>Есть два способа бороться с этим:</p><ol><li>Authentihash — это хэш, который считается только по подписанным областям PE-файла. У всех 2500 вариантов TrueSight.sys один и тот же Authentihash, потому что подписанная часть не менялась. Если SIEM или EDR умеет работать с Authentihash — детект становится устойчивым к CVE-2013-3900.</li><li>Сертификат подписи — вместо хэша файла можно строить детект на сертификате, которым подписан драйвер (Subject, Issuer, Serial Number). Даже после модификации байтов сертификат остаётся тем же. Для Sysmon EID 6 доступны поля SignatureStatus и Signature — их можно использовать для фильтрации.</li></ol><p><br />В KUMA это реализуется через дополнительную lookup-таблицу с Authentihash-значениями (доступны на LOLDrivers.io в формате CSV) или через проверку сертификата подписи в событиях Sysmon EID 6.</p><p>По сертификату подписи:</p><p>Митигация CVE-2013-3900 на уровне ОС — включить строгую проверку Authenticode через реестр:</p><p>После этого модифицированные драйверы с padding перестанут считаться подписанными. Фикс существует с 2013 года, но не включён по умолчанию — Microsoft боится сломать совместимость.</p><h2>Детект 2. Подозрительное создание сервиса для драйвера</h2><p>MITRE ATT&amp;CK: T1543.003 (Create or Modify System Process: Windows Service)</p><p>Загрузка драйвера в Windows происходит через создание сервиса типа «kernel driver». Это генерирует события Windows Security (Event ID 4697 — A service was installed in the system) и System (Event ID 7045 — A new service was installed). Детект фокусируется на аномалиях:</p><p><b>Логика алерта:</b></p><p>Событие: создание нового сервиса с типом kernel driver (Event ID 7045). Условие: ImagePath указывает на файл вне стандартных директорий драйверов. <br /><br />EID 7045 не содержит информации о родительском процессе — SCM логирует только параметры сервиса. Поэтому детектирование разбито на два правила: первое ловит аномальный путь в самом событии создания сервиса, второе — запуск sc.exe create type=kernel через Sysmon EID 1.</p><p><br /></p><p>+</p><h2>Детект 3. Создание символической ссылки на драйверы/файлы security-вендоров</h2><p>MITRE ATT&amp;CK: T1036 (Masquerading), T1562.001 (Impair Defenses)</p><p>Для детектирования техники Symbolic Link + BYOVD необходимо мониторить создание символических ссылок (junction points, reparse points) в системных директориях или указывающих на файлы security-вендоров.</p><p><b>Логика алерта:</b></p><p>Событие создания файла типа symbolic link, где компания-производитель целевого файла — security-вендор, а путь указывает на системную директорию драйверов.</p><p>На каком событии строить детект: Sysmon Event ID 11 (FileCreate) — срабатывает при создании файлов, включая reparse points (junction/symlink).</p><p>Правило в логическом виде:</p><p><b>Проще говоря: кто-то создал что-то в папке drivers\ и это не установщик драйверов Windows — подозрительно.</b></p><p>Детектирование Symbolic Link + BYOVD возможно на двух уровнях.</p><p>Базовый — через Sysmon Event ID 11: любое создание файла в C:\Windows\System32\drivers\ процессом, не являющимся штатным установщиком, генерирует алерт.</p><p>Продвинутый — через EDR-телеметрию, где доступен тип файла (symlink) и метаданные целевого объекта (File Company Name). Это позволяет точно детектировать создание символической ссылки, подменяющей компонент security-вендора, с минимальным уровнем false positive.</p><p>Логика реализуема в EDR-решениях с расширенной файловой телеметрией (Kaspersky KEDR Expert, BIZONE EDR) где доступны поля типа файла (symlink/junction) и метаданные PE-заголовка целевого объекта (CompanyName, FileDescription).</p><h2>Детект 4. Исчезновение kernel callbacks / молчание EDR</h2><p>MITRE ATT&amp;CK: T1562.001 (Impair Defenses: Disable or Modify Tools)</p><p>Один из самых сложных, но самых ценных детектов — обнаружение факта отключения kernel callbacks. Прямой мониторинг невозможен (если ETW отключён, события не генерируются), но можно использовать косвенные индикаторы:</p><ul><li>Heartbeat-мониторинг EDR: если EDR-агент перестал отправлять телеметрию (или отправляет, но количество событий аномально снизилось) — это критический индикатор. SOC должен мониторить поток событий от каждого агента.</li><li>ETW consumer watchdog: периодический опрос состояния ETW-сессий через logman query. Если системные ETW-сессии внезапно прекратились — это сигнал.</li><li>Kernel callback verification: специализированные инструменты (или кастомный драйвер мониторинга) могут периодически проверять целостность массивов PspCreateProcessNotifyRoutine и CallbackListHead.</li></ul><p><br /></p><p><b>Логика алерта:</b></p><p>Условие: EDR-агент на хосте X не отправлял телеметрию более N минут (порог зависит от нормальной частоты). ИЛИ количество событий от агента снизилось более чем на 90% по сравнению с базовой линией за аналогичный период. Severity: Critical.</p><p>В KUMA это реализуется правилом на отсутствие событий: создаём корреляцию с типом «отсутствие события» (absence), где условие — от конкретного хоста не поступало ни одного события Sysmon за последние 10 минут. Порог подбирается под среду: для рабочих станций 10 минут, для серверов с высокой активностью — 5 минут.</p><h2>Детект 5. Нетипичный процесс открывает хэндл к драйверу</h2><p>MITRE ATT&amp;CK: T1068 (Exploitation for Privilege Escalation)</p><p>При эксплуатации уязвимого драйвера атакующий вызывает CreateFile("\\\\.\\&lt;DeviceName&gt;") для получения хэндла, а затем DeviceIoControl() для отправки IOCTL-команд. В случае успешной загрузки обращение шло бы к устройству <a>\\.\Blackout</a> — объекту, зарегистрированному загруженным драйвером Blackout.sys.</p><p><b>Логика алерта:</b></p><p>Событие: если к устройству драйвера Dell (\\.\DBUtil_2_3) обращается не процесс Dell, а неизвестный бинарник из C:\Users\Downloads\ — это аномалии.</p><p>Реализация этого детекта требует расширенной телеметрии: аудита доступа к объектам ядра (Windows Security Policy → Object Access) или EDR с мониторингом device handle operations. Стандартный Sysmon этот уровень не покрывает — это один из аргументов в пользу EDR-решений с kernel-level телеметрией, даже с учётом рисков BYOVD.</p><p>В KEDR Expert и BI.ZONE EDR операции DeviceIoControl логируются через kernel-level телеметрию.</p><p>Если таких EDR нет — можно включить Object Access Auditing через GPO (Computer Configuration → Windows Settings → Security Settings → Advanced Audit Policy → Object Access → Audit Kernel Object), но это генерирует большой объём событий и требует тщательной фильтрации.</p><h2>Детект 6. Аномалии PreviousMode</h2><p>MITRE ATT&amp;CK: T1068 (Exploitation for Privilege Escalation)</p><p>Этот детект — скорее гипотеза для threat hunting, чем правило для автоматического алертинга. Прямой мониторинг PreviousMode из user mode невозможен, но косвенные признаки могут указать на эксплуатацию:</p><p>PreviousMode это поле в структуре потока, которое говорит ядру: «Этот запрос пришёл из user mode или из kernel mode?»</p><p>Lazarus через CVE-2024-21338 менял это значение с 1 на 0. После этого обычный процесс мог вызывать NtWriteVirtualMemory и писать прямо в память ядра — ядро думало что запрос от компонента ядра.</p><p>Изменение PreviousMode в _KTHREAD — ключевой примитив атак CVE-2024- 21338 и аналогичных. Напрямую мониторить это из user mode невозможно, но можно детектировать косвенные признаки:</p><ul><li>Процесс из user mode успешно вызывает NtWriteVirtualMemory / NtReadVirtualMemory для адресов пространства ядра системы (&gt; 0x7FFFFFFFFFFF) — это аномалия, которую можно детектировать через ETW-провайдер Microsoft-Windows-Kernel-Audit-API-Calls (если он ещё не отключён)</li><li>Процесс LOCAL_SERVICE внезапно выполняет операции, не характерные для этого аккаунта — например, создаёт файлы, загружает DLL, устанавливает сетевые соединения.</li></ul><h2>Детект 7. Загрузка драйвера с отозванным или истёкшим сертификатом</h2><p>MITRE ATT&amp;CK: T1553.002 (Subvert Trust Controls: Code Signing)</p><p>Sysmon EID 6 при загрузке драйвера фиксирует статус подписи. Если подпись невалидна, отозвана или просрочена — это повод для алерта.</p><p>В конфигурации Sysmon должен быть включён тег &lt;CheckRevocation/&gt;.</p><p><b>Логика алерта:</b></p><p>Событие: загрузка драйвера (Sysmon EID 6). Условие: SignatureStatus не равен 'Valid'.</p><p>Дополнительный фильтр для снижения FP: исключить драйверы Microsoft, подписанные в тестовом режиме (если на хосте включён testsigning).</p><p>Этот детект ловит атаки типа EnCase BYOVD (Huntress, 2026): драйвер с сертификатом 2010 года, отозванным 15 лет назад, но всё ещё загружаемым Windows.</p><h2>Детект 8. Комплексный подход: корреляция событий</h2><p>Самый мощный детект — корреляция слабых сигналов в рамках одного инцидента. Типичная цепочка BYOVD-атаки генерирует следующую последовательность:</p><ol><li>Файл .sys появляется в нетипичной директории (File Create)</li><li>Создаётся новый сервис типа kernel driver (Event ID 7045)</li><li>Загружается драйвер с хэшем из базы LOLDrivers (Sysmon ID 6)</li><li>Процесс открывает хэндл к устройству драйвера (File/Object Access)</li><li>Один или несколько EDR/AV процессов завершаются (Event ID 4689) или перестают генерировать телеметрию</li><li>Загруженный драйвер имеет невалидную, отозванную или просроченную подпись (Sysmon EID 6, SignatureStatus ≠ Valid)</li></ol><p><b>Логика корреляционного правила:</b></p><p>Если на одном хосте в течение 5 минут происходят события #1 + #2 + (#3 ИЛИ #5 ИЛИ #6) — это с высокой вероятностью BYOVD-атака.</p><h2>Готовые правила для SIEM KUMA</h2><p>Для тех, кто работает с KUMA — пять правил корреляции, адаптированных под синтаксис платформы. Время внедрения — 15–20 минут на правило.</p><h3>Правило 1. Загрузка драйвера из нестандартного пути</h3><p>Тип: простое | Источник: Sysmon | Severity: HIGH | MITRE: T1068, T1543.003</p><p>Реакция: проверить хэш на loldrivers.io, найти источник файла (EID 11).</p><h3>Правило 2. Создание kernel-mode сервиса</h3><p>Тип: простое | Источник: Windows System Log | Severity: HIGH | MITRE: T1543.003</p><p>FP: установка драйверов ПО/принтеров. Коррелировать с EID 6.</p><h3>Правило 3. sc.exe create type=kernel</h3><p>Тип: простое | Источник: Windows Security / Sysmon | Severity: HIGH | MITRE: T1543.003</p><h3>Правило 4. Массовое завершение защитных процессов</h3><p>Тип: агрегация (count) | Источник: Sysmon | Severity: CRITICAL | MITRE: T1562.001</p><p>Реакция: НЕМЕДЛЕННАЯ ИЗОЛЯЦИЯ хоста!</p><h3>Правило 5. ETW tampering через CLI</h3><p>Тип: простое | Источник: Windows Security / Sysmon | Severity: HIGH | MITRE: T1562.006</p><h2>Митигации: как снизить риск BYOVD</h2><p>BYOVD не закрывается одним патчем — уязвимых подписанных драйверов сотни. Но усложнить атаку можно.</p><h3>№1. HVCI (Hypervisor-Protected Code Integrity)</h3><p>HVCI (также известный как Memory Integrity) использует гипервизор для контроля целостности кода ядра. С включённым HVCI загрузка драйверов проверяется на уровне VTL1, что значительно затрудняет эксплуатацию уязвимых драйверов. Ограничение: HVCI может вызывать проблемы совместимости со старым оборудованием и драйверами.</p><p>HVCI защищает ключевые структуры ядра, включая ci!g_CiOptions — переменную, контролирующую проверку подписей драйверов. Без HVCI атакующий с BYOVD-примитивом может перезаписать ci!g_CiOptions и загрузить вообще любой неподписанный драйвер. С включённым HVCI эта переменная находится под защитой гипервизора (VTL1), и попытка записи вызовет исключение. Это делает HVCI единственной митигацей, защищающей ci!g_CiOptions на уровне гипервизора.</p><h3>№2. Microsoft Vulnerable Driver Blocklist</h3><p>Microsoft поддерживает список заблокированных уязвимых драйверов, который может применяться через WDAC (Windows Defender Application Control) или ASR (Attack Surface Reduction) правила. Важно убедиться, что этот список обновляется регулярно — по умолчанию он обновляется только с крупными обновлениями Windows.</p><h3>№3. ASR Rules</h3><p>ASR (Attack Surface Reduction) — это набор правил в Windows Defender, которые блокируют типичные действия атакующих. Одно из правил специально для BYOVD.</p><p>Attack Surface Reduction правило «Block abuse of exploited vulnerable signed drivers» (GUID: 56a863a9-875e-4185-98a7-b882c64b5ce5) может блокировать загрузку известных уязвимых драйверов. Рекомендуется включить в режиме аудита, а затем перевести в блокировку после проверки совместимости.</p><h3>№4. Мониторинг сервисов и драйверов</h3><ul><li>Настроить аудит создания сервисов (Event ID 7045, 4697).</li></ul><ul><li>Мониторить загрузку драйверов через Sysmon (Event ID 6) с автоматической проверкой хэшей по LOLDrivers.</li><li>Внедрить EDR heartbeat-мониторинг с алертом на молчание агента.</li><li>Ограничить права на создание сервисов типа kernel driver — минимизировать число учётных записей с привилегией SeLoadDriverPrivilege.</li></ul><h3>№5. Принцип наименьших привилегий</h3><p>BYOVD-атака требует привилегий администратора (для загрузки драйвера) или LOCAL_SERVICE (для CVE-2024-21338). Меньше админов на эндпоинтах — меньше шансов у атакующего загрузить драйвер. Audit и контроль использования привилегированных учётных записей (PAM, JIT-доступ) остаются критически важными.</p><h3>№6 Проактивный аудит: как находить уязвимые драйверы до атакующих</h3><p>Все детекты и митигации выше работают реактивно — мы ловим атаку, которая уже происходит, или блокируем драйверы, которые уже попали в базы. Но в инфраструктуре любой крупной компании десятки или сотни драйверов от разных вендоров, и далеко не все из них проверены на уязвимости. Промышленные контроллеры, банковское оборудование, принтеры, сканеры, специализированное ПО — всё это ставит свои драйверы, которые работают в Ring 0 и могут содержать IOCTL-обработчики с классическими багами.</p><p>В 2023 году исследователи из <a href="https://www.youtube.com/watch?v=nBOxWo_MC4M" rel="nofollow">TeamT5</a> представили на HITCON инструмент IOCTLance, который решает именно эту задачу: автоматический поиск уязвимостей в WDM-драйверах без необходимости запускать их на реальной системе. За счёт комбинации символьного выполнения и taint-анализа IOCTLance нашёл 117 ранее неизвестных уязвимостей в 26 драйверах, что привело к назначению 41 CVE — среди затронутых вендоров оказались AMD, Dell, IObit, Microsoft (Visual Studio).</p><p>Подход работает так. Инструмент берёт бинарник драйвера, находит в нём IOCTL-обработчики и вместо реальных данных подаёт на вход символьные переменные. Затем прослеживает все пути выполнения кода и проверяет, попадают ли контролируемые пользователем данные в опасные функции: MmMapIoSpace (маппинг физической памяти), ZwOpenProcess без OBJ_FORCE_ACCESS_CHECK (открытие хэндла к произвольному процессу), memcpy с контролируемым размером (переполнение буфера), вызов функции по указателю из input buffer (выполнение произвольного кода в ядре) и ещё пять типов уязвимостей. На выходе — конкретный IOCTL-код, адрес уязвимой инструкции и описание, какие именно поля входного буфера контролирует атакующий.</p><p>Почему это применимо на практике? База LOLDrivers.io каталогизирует сотни уязвимых драйверов, но покрывает только те, которые уже кто-то исследовал. Драйвер от условного вендора банковских терминалов или системы контроля доступа может содержать точно такие же баги (произвольное чтение/запись памяти через IOCTL), но никто его не проверял, и в LOLDrivers его нет. Атакующий, который получит этот драйвер, сможет использовать его для BYOVD — а детекты по хэшам не сработают, потому что драйвера нет ни в одной базе.</p><h2>Заключение</h2><p>BYOVD — это стандартный этап ransomware-операций, доступный через готовые тулкиты и базы уязвимых драйверов, так как публичные инструменты снизили порог входа до минимума.</p><p>Для SOC-команд и detection-инженеров это означает необходимость пересмотра подходов к мониторингу:</p><ul><li>Хэш-детектирование загрузки уязвимых драйверов (LOLDrivers.io) — базовый, обязательный детект.</li><li>Мониторинг создания сервисов типа kernel driver из нетипичных источников.</li><li>Heartbeat-мониторинг EDR-агентов с алертом на молчание.</li><li>Корреляция: файл .sys + сервис + завершение EDR = автоматическая изоляция.</li><li>Технические митигации: HVCI, ASR rules, Microsoft Vulnerable Driver Blocklist.</li></ul><p>Если ваша стратегия безопасности начинается и заканчивается на EDR, BYOVD-атака может оставить вас полностью слепыми. Сетевой мониторинг, контроль привилегий, HVCI и проверка живости агентов — надёжнее любого отдельного EDR.</p><h2>Чек-лист: защита от BYOVD</h2><p>Оставляю чек-лист — распечатайте и держите рядом.</p><h3>Предотвращение</h3><p>☐ HVCI (Memory Integrity) включён на рабочих станциях и серверах.</p><p>☐ Microsoft Vulnerable Driver Blocklist актуален.</p><p>☐ ASR-правило «Block abuse of exploited vulnerable signed drivers» активно.</p><p>☐ SeLoadDriverPrivilege ограничена минимальным числом учётных записей.</p><p>☐ MFA на VPN и всех внешних точках входа</p><h3>Обнаружение</h3><p>☐ Sysmon установлен, EID 6 собирается без агрессивной фильтрации.</p><p>☐ &lt;CheckRevocation/&gt; включён в конфигурации Sysmon.</p><p>☐ LOLDrivers-хэши импортированы как lookup-таблица в SIEM</p><p>☐ Командная строка логируется в EID 4688 (GPO → Include command line) ☐ Правило на sc.exe create type=kernel в SIEM</p><p>☐ Правило на массовое завершение EDR-процессов в SIEM</p><h3>Контроль</h3><p>☐ Heartbeat-мониторинг EDR-агентов настроен (алерт при молчании &gt; 5 мин).</p><p>☐ Корреляция: файл .sys + сервис + завершение EDR = автоизоляция.</p><p>☐ Периодическая проверка целостности ETW-сессий (logman query).</p>]]></content:encoded>
    </item>
    <item>
      <title>36 языков, 3 модуля в едином интерфейсе, встроенные цифровые сотрудники и безопасный код для вашего продукта</title>
      <link>https://tproger.ru/articles/36-yazykov--3-modulya-v-edinom-interfejse--vstroennye-cifrovye-sot</link>
      <comments>https://tproger.ru/articles/36-yazykov--3-modulya-v-edinom-interfejse--vstroennye-cifrovye-sot?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Соколова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/36-yazykov--3-modulya-v-edinom-interfejse--vstroennye-cifrovye-sot</guid>
      <description><![CDATA[<p>Безопасность разработки под контролем: команда Solar создала продукт, который объединяет статический, динамический анализ, анализ состава и цепочки поставок ПО. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/36-yazykov--3-modulya-v-edinom-interfejse--vstroennye-cifrovye-sot">36 языков, 3 модуля в едином интерфейсе, встроенные цифровые сотрудники и безопасный код для вашего продукта</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Feb 2026 09:28:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>⭐ <b>Участник Продуктовой Премии Tproger 2025 — проголосовать за кейс <a href="https://tprg.ru/pW1T">можно по ссылке</a></b></p><p><i>Solar appScreener разработан для повышения уровня кибербезопасности программного обеспечения путём комплексного анализа на каждом этапе жизненного цикла разработки. Согласно данным отчёта Solar 4RAYS за 2024 год, около 54% инцидентов связаны с уязвимостями веб-приложений. </i></p><p>Межсайтовый скриптинг, SQL-инъекция, неограниченная загрузка файла опасного типа, внедрение команды ОС, обход авторизации — всё это можно найти и исправить заранее. <a href="https://tprg.ru/Qu0F" rel="nofollow">Solar appScreener</a> объединяет статический анализ SAST, динамическое тестирование DAST и проверку сторонних библиотек OSA.</p><p>Главная инновация — AI-модули или Цифровые сотрудники, которые работают даже без доступа в Интернет, обучаемые на протяжении семи лет. Они не просто помогают обрабатывать найденные  уязвимости, но и сами генерируют исправленный код. Большинство предложенных исправлений  разработчики принимают без доработок.</p><h2>Параметры проекта</h2><p>История: продукт начал свою историю 10 лет назад внутри российского стартапа. Сегодня поддерживает 36 языков программирования — ABAP, Apex, ASP.NET, COBOL, С#, C/C++, Objective-C, Dart, Delphi, Go, Groovy, HTML5, Java, Java for Android, JavaScript, JSP, Kotlin, LotusScript, Pascal, Perl, PHP, PL/SQL, T/SQL, Python, Ruby, Rust, Scala, Solidity, Swift, TypeScript, VBA, VB.NET, VBScript, Visual Basic 6.0, Vyper, 1C</p><p>Анализ бинарных файлов 10 форматов — JAR, WAR, EAR, AAR, DLL, EXE, APK, AAB, IPA, APP</p><p>Обучение ИИ: семь лет на тренировку модулей DerTriage AI и DerCodeFix AI</p><h2>Задача: найти уязвимости в ПО до того, как их найдут хакеры</h2><p>Какие проблемы можно решить с помощью анализа кода?</p><ol><li>Избежать финансовые потери: Большинство инцидентов, связанных с кибератаками связано с недостаточной защитой веб-приложений и программного обеспечения, что ведет к значительным финансовым убыткам у компаний. Даже одна уязвимость – может стать причиной, по которой хакеры проникнут в контур компании, где вы работаете.</li><li>Потеря доверия клиентов: Атаки хакеров негативно влияют на репутацию бренда и доверие потребителей.</li><li>Несоблюдение нормативных требований: Компании сталкиваются с необходимостью соответствовать строгим требованиям регуляторов, игнорирование которых влечет серьезные последствия.</li><li>Повышенная нагрузка на команду: Недостаточная автоматизация процессов выявления уязвимостей увеличивает нагрузку на разработчиков, DevSecOps-инженеров и сотрудников информационной безопасности.</li></ol><p>Российский рынок характеризуется особыми рисками, такими как целенаправленные атаки на отечественные информационные системы. Использование open-source-библиотек несет дополнительные опасности. Например, деструктивные действия со стороны отдельных представителей open source сообщества. Отсутствие регулярных проверок повышает вероятность появления закладок или слабых мест, что подчеркивает необходимость внедрения специализированных инструментов вроде Solar appScreener.</p><h2>Архитектура решения</h2><p>В архитектуре три главных инструмента:</p><ol><li>OSA (Open Source Analysis): анализ стороннего кода выявляет известные зависимости, проверяет лицензии open-source-библиотек и выявляет риски использования компонент на основании поведения авторов, обеспечивая безопасность поставок и юридическую чистоту проекта.</li><li>SAST (Static Application Security Testing): Статический анализ обнаруживает уязвимости в исходном коде с первых этапов разработки. Цифровые сотрудники — компоненты, помогающие обрабатывать результаты сканирования основанные на технологии машинного обучения.</li><li>DAST (Dynamic Application Security Testing): Динамическое тестирование анализирует веб-приложения и ПО, отправляя заведомо неверные данные и проверяя реакцию приложения на них.</li></ol><p>Каждый метод дополняет друг друга, создавая комплексную систему анализа. Дополнительно платформа интегрируется с CI/CD-конвейерами, что позволяет минимизировать ручную работу и повысить скорость развертывания обновленных версий.</p><h2>Ключевые инновации и технические решения номинированного продукт</h2><p>Solar appScreener кардинально меняет правила игры в обеспечении анализа кода программных продуктов, предлагая идеальный баланс между быстротой разработки и высочайшими стандартами безопасности.</p><p><b>Почему AppScreener выигрывает:</b></p><ul><li>Избавление от ложных срабатываний</li></ul><p>Проблема ложных срабатываний в инструментах SAST стала камнем преткновения для многих команд. Однако интеллектуальные Цифровые сотрудники решают её окончательно. За счёт семилетнего обучения эти модули мгновенно фильтруют лишние предупреждения, оставляя лишь критически важные уязвимости, нуждающиеся в исправлении. А также предлагают исправленные участки кода для найденной уязвимости. При этом большинство предложенных исправлений принимается без доработок от разработчиков и AppSec-команд.</p><ul><li>Увеличение скорости разработки</li></ul><p>Производительность вашей команды растет экспоненциально. Вместо недель ожидания отчётов и кучи задач - теперь отчёт доступен буквально за считанные минуты. Исправления уязвимостей занимают секунды, а не дни. Все это способствует значительному снижению сроков вывода продуктов на рынок (time-to-market) и одновременно сохранению высокого уровня безопасности.</p><ul><li>Интеграция с современной средой разработки</li></ul><p>AppScreener идеально встраивается в существующие CI/CD конвейеры и рабочие среды, обеспечивая максимальную совместимость и комфорт для разработчиков. Инструмент легко адаптируется к любым условиям, будь то небольшой стартап или крупная корпорация.</p><ul><li>Уникальная инфраструктура и надежность</li></ul><p>Наш продукт разработан в России и прошел самую жесткую сертификацию. Мы предлагаем поддержку широкого спектра популярных языков программирования, в том числе написанных на “устаревших” языках. Это делает AppScreener незаменимым инструментом для компаний любого масштаба.</p><p>Основные преимущества AppScreener заключаются в интеграции передовых методов анализа и автоматизации процесса устранения уязвимостей.</p><h2>Путь от стартапа до стандарта рынка</h2><p>Продукт начал свою историю внутри российского стартапа, занимающейся консультированием по вопросам безопасности. Команда начала развивать идею продукта в сегменте application security. Процесс включал  исследования и разработки, которые в итоге завершились созданием эффективного инструмента для анализа программного обеспечения и приложений. Ряд сотрудников Солар, благодаря своей работе получили научные степени.</p><h2>Результаты: скорость и экономия</h2><p>Устранение уязвимостей  на поздних стадиях развития ПО или прям перед его выпуском в продакшн обходится существенно дороже, чем ранняя проверка кода на безопасность. appScreener помогает сократить издержки и оптимизировать бюджет.</p><ol><li>Экономия ресурсов: Раннее выявление и быстрое исправление уязвимостей экономит средства, необходимые для ликвидации последствий серьезных инцидентов.</li><li>Оптимизация бюджета: Сокращение количества ложных срабатываний за счет новых разработок снижает расходы на обработку данных и привлечение квалифицированных специалистов.</li><li>Увеличение скорости вывода продукта на рынок: благодаря автоматизированному исправлению ошибок, новые версии продуктов выходят быстрее, сохраняя высокое качество.</li></ol><p>Эти показатели подтверждают эффективность инструмента и способствуют повышению конкурентоспособности бизнеса.</p><h2>Отзывы клиентов</h2><p>Клиенты отмечают высокую точность обнаружения уязвимостей и удобство использования инструмента. Особенно ценится возможность быстро интегрироваться в существующие процессы разработки и эффективно снижать риски. Использование AppScreener положительно влияет на конкурентоспособность российских продуктов. Открытые кейсы внедрений доступны на сайте от лица людей, которые их давали.</p><h2>Планы развития</h2><p>Команда продолжает развивать <a href="https://tprg.ru/Qu0F" rel="nofollow">Solar appScreener</a>, проводя совместные исследования, интересные рынку. Запущена первая в России премия по безопасной разработке совместно с Ассоциацией ФинТех и сообществом FinDevSecOps. В планах — дальнейшее обучение ИИ-моделей.</p><p><i>Реклама. АО «Солар Секьюрити», ИНН 9714069290, erid: 2W5zFJQwYmo</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Исследование: 90% кода, написанного с вайб-кодингом, содержит уязвимости</title>
      <link>https://tproger.ru/news/issledovanie--90--rewenij-s-ispolzovaniem-vajb-kodinga-soderzhat-uyazvimosti</link>
      <comments>https://tproger.ru/news/issledovanie--90--rewenij-s-ispolzovaniem-vajb-kodinga-soderzhat-uyazvimosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/issledovanie--90--rewenij-s-ispolzovaniem-vajb-kodinga-soderzhat-uyazvimosti</guid>
      <description><![CDATA[<p>Исследование показало, что 90% кода, созданного через вайб-кодинг, содержит уязвимости. Даже если функции проходят тесты</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/issledovanie--90--rewenij-s-ispolzovaniem-vajb-kodinga-soderzhat-uyazvimosti">Исследование: 90% кода, написанного с вайб-кодингом, содержит уязвимости</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Dec 2025 06:18:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>По данным недавнего опроса, 75% разработчиков так или иначе используют вайб-кодинг. А многие компании — включая Anthropic — открыто говорят, что применяют его «в проде».</p><p>Но вместе с ростом популярности подхода, возник и главный вопрос: <b>насколько безопасен код, который генерирует ИИ-агент</b>?</p><h2>Исследование показало: функционально — да, безопасно — нет</h2><p>Ученые из <i>Carnegie Mellon</i>, <i>Columbia</i> и <i>Johns Hopkins</i> <a href="https://arxiv.org/pdf/2512.03262">выпустили</a> первое крупное исследование безопасности вайб-кодинга.</p><p>Они создали собственный бенчмарк <b>SUSVIBES</b>, состоящий из <b>200 настоящих задач с GitHub-проектов</b>, где ранее были реальные уязвимости (77 видов CWE).</p><p>Каждая задача требует внедрения фичи в живой репозиторий размером в сотни тысяч строк. Это максимально приближено к реальной работе.</p><p>Далее они протестировали популярных агентов: <b>SWE-Agent</b>, <b>OpenHands</b> и <b>Claude Code</b>. Все они использовали самые свежие ИИ-модели вроде <b>Claude 4 Sonnet</b>, <b>Gemini 2.5 Pro </b>и <b>Kimi K2</b>.</p><p>Результаты оказались тревожными:</p><ul><li><b>61%</b> решений от лучшей связки (SWE-Agent + Claude 4 Sonnet) — функционально корректны.</li><li>Но только <b>10,5%</b> — безопасны.</li><li>Иными словами: около <b>90%</b> рабочего кода, который агент считает «готовым», содержит уязвимости.</li></ul><p>Аналогичная картина у всех других агентов и моделей: большинство результатов проходят функциональные тесты, но сыпятся на тестах безопасности.</p><h2>Какие уязвимости генерируют ИИ-агенты</h2><p>Исследователи обнаружили весь спектр проблем:</p><ul><li>утечки данных и неправильная обработка паролей;</li><li>XSS и небезопасные URL-редиректы;</li><li>ошибки верификации сессий;</li><li>тайминг-атаки;</li><li>отсутствие проверки входных данных.</li></ul><p>Что характерно, в реальных задачах агенты часто пишут код, который выглядит вполне логично. Но они все же упускают один-два критичных условия, создавая легко эксплуатируемые уязвимости.</p><p>На визуальных примерах в исследовании видно, что даже маленькие фрагменты вроде verify_password или URL-редиректа превращаются в брешь безопасности, если агент пропускает один шаг — например, нормализацию данных или сравнение времени выполнения.</p><h2>Вывод</h2><p>Исследователи подчеркивают: вайб-кодинг полезен для увеличения продуктивности, но <b>категорически непригоден без ручного ревью безопасности</b>.</p><p>Особенно это касается тех проектов, которые работают с данными пользователей, авторизацией, сессиями, API или любыми критичными процессами.</p><p>ИИ-агент может написать фичу, пройти тесты и выглядеть уверенно. Но с вероятностью около 80–90% там останется дыра, которая в реальной среде превратится в эксплойт.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как изменилась защита от DDoS-атак в 2025 году</title>
      <link>https://tproger.ru/articles/kak-izmenilas-zashhita-ot-ddos-atak-v-2025-godu</link>
      <comments>https://tproger.ru/articles/kak-izmenilas-zashhita-ot-ddos-atak-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Alex Smirnov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-izmenilas-zashhita-ot-ddos-atak-v-2025-godu</guid>
      <description><![CDATA[<p>Узнайте, как в 2025 году изменились DDoS-атаки, почему старые методы больше не работают и какие технологии помогают защитить сайты от угроз.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-izmenilas-zashhita-ot-ddos-atak-v-2025-godu">Как изменилась защита от DDoS-атак в 2025 году</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Информационная безопасность: веб-пентест]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Oct 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Новая среда DDoS-угроз</h2><p>За последние годы атаки типа DDoS (Distributed Denial of Service) стали не просто вопросом «когда», а практически неизбежностью для многих компаний. Специалисты отмечают: «для организаций с высокой видимостью уже не вопрос если, а когда вас атакуют».</p><p><b> Главные изменения:</b></p><ul><li>Доступность инструментария «DDoS-as-a-Service» делает возможными атаки даже с небольшими знаниями.</li><li>Атаки становятся быстрее, изощреннее, и все чаще выполняются автоматически. Например, могут запустить миллионы запросов за несколько минут – и даже прежде чем мониторинг сработает.</li><li>Атакующие все чаще обходят простые фильтры: меняют URL, заголовки, куки, используют бот-сети с огромным географическим разбросом.</li><li>Рост объемов: по данным Cloudflare, крупные атаки выросли экспоненциально за последние десять лет. Например, битрейт (Gbps) вырос с сотен Gbps до 5.6 Tbps к 2025 году.</li></ul><p>Эти изменения обуславливают, почему устаревшие методы защиты уже не работают или работают слабо.</p><h2>Почему традиционные решения уступают</h2><p>Если раньше меры ограничивались фаерволами, CDN и простыми лимитами, то сегодня этого недостаточно. CDN или фаервол часто настроены по-умолчанию и дают лишь частичную защиту.</p><p>Атаки перешли с сетевого уровня на уровень приложений (Layer 7) – где они влияют на веб-сервисы и API, которые генерируют ключевой доход</p><p>Ключевые уязвимости:</p><ul><li>Блокировка по IP/ГЕО становится бессильной, когда источники атак меняются динамически.</li><li>Статические правила (лимиты, капчи) не успевают реагировать на автоматизированные, быстрые атаки.</li><li>Отслеживание только трафика без анализа поведения – позволяет атакам «проскальзывать» через кэши и защитные механизмы.</li></ul><h2>Современные подходы к защите в 2025 году</h2><p>Как должна выглядеть эффективная <a href="https://stormwall.pro/resources/blog/ddos-ataka-kak-zashchititsya">защита от DDoS</a> сегодня? Вот основные принципы:</p><ol><li><b>Многоуровневая стратегия: </b>защита должна быть на уровне edge (CDN), приложения и поведения. Например, скрытие исходного сервера, лимиты не только на динамические запросы, но и на кэш-контент; специальные правила против «cache-busting».</li><li><b>Анализ поведения и автоматизация:</b> атаки идут очень быстро (в 2023 году 50 % атак длились менее 52 секунд). Поэтому вручную реагировать уже нельзя – требуется автоматизированная система, которая распознает паттерны: заголовки, время запросов, структура.</li><li><b>Инфраструктурные меры и глобальное распределение.</b> Важно подчеркнуть значение глобальных anycast-сетей, автоматизированной фильтрации и подхода без лимитов на трафик («unmetered DDoS mitigation»).</li><li><b>Проактивный партнер и мониторинг:</b> все домены через CDN, лимиты на кэш/некэш-трафик, мониторинг скрытых сигналов (например, странные запросы), наличие плана инцидентов.</li></ol><h2>Что это значит на практике. Рекомендации:</h2><ul><li>Убедитесь, что ваша инфраструктура направляется через надежный CDN и исходные сервера не видны напрямую.</li><li>Настройте лимиты и кэширование не только для типичного контента, но и для потенциально «обратных» точек: поиск, ошибки 404, динамика.</li><li>Выбирайте решения с автоматическим анализом поведения, а не только статическими правилами.</li><li>Проверяйте партнеров: способны ли они эффективно действовать без вашего ручного вмешательства и с минимальным влиянием на законный трафик.</li><li>Рассмотрите услуги по защите от DDoS через специализированных провайдеров – на сайте <a href="https://stormwall.pro">https://stormwall.pro</a> вы найдете соответствующие предложения, например защита для сайта <a href="https://stormwall.pro/products/website-ddos-protection">https://stormwall.pro/products/website-ddos-protection</a>.</li><li>Не забывайте: защита – это не покупка и установка, а постоянная адаптация. Атаки эволюционируют и защита должна меняться вместе с ними.</li></ul><h2>Заключение</h2><p>В 2025 году защита от DDoS-атак перестала быть опцией -это необходимость. Атаки стали массовыми, автоматизированными, мощными и адаптивными. Традиционные меры уже часто не справляются. Поэтому требуется переход к многоуровневой, автоматизированной, поведенческой защите с глобальной инфраструктурой и проактивным партнером.</p><p>Если вы до сих пор полагаетесь лишь на базовый фаервол или CDN по-умолчанию, сейчас отличный момент пересмотреть подход и усилить защиту своих онлайн-сервисов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Unity раскрыла давнюю уязвимость и просит разработчиков срочно обновить игры</title>
      <link>https://tproger.ru/news/unity-raskryla-davnyuyu-uyazvimost-i-prosit-razrabotchikov-srochno-obnovit-igry</link>
      <comments>https://tproger.ru/news/unity-raskryla-davnyuyu-uyazvimost-i-prosit-razrabotchikov-srochno-obnovit-igry?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/unity-raskryla-davnyuyu-uyazvimost-i-prosit-razrabotchikov-srochno-obnovit-igry</guid>
      <description><![CDATA[<p>Unity сообщила о серьёзной уязвимости в проектах на версиях 2017.1+ для Windows/Android/macOS. Патчи уже доступны, Steam и Microsoft добавили защиты. Что делать разработчикам и игрокам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/unity-raskryla-davnyuyu-uyazvimost-i-prosit-razrabotchikov-srochno-obnovit-igry">Unity раскрыла давнюю уязвимость и просит разработчиков срочно обновить игры</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Unity]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 06 Oct 2025 11:22:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Unity <a href="https://www.theverge.com/news/791609/unity-security-exploit-developers-update-games">объявила</a> о серьёзной уязвимости безопасности, которая затрагивает проекты, созданные на версиях движка начиная с Unity 2017.1 и выпущенные для Windows, Android и macOS (а также Linux, по данным профильной прессы). Компания призвала разработчиков принять немедленные меры и выпустить обновления. При этом Unity подчёркивает: признаков эксплуатации уязвимости нет, на пользователей и клиентов влияния не зафиксировано. Исправления уже доступны, партнёры по платформам включили дополнительные защиты.</p><p>Уязвимость <a href="https://www.pcgamer.com/hardware/unity-has-found-a-security-vulnerability-that-has-sat-dormant-for-almost-a-decade-take-immediate-action-to-protect-your-games-and-apps/">выявили</a> в июне, а устранили в октябре.</p><h2>Что случилось</h2><p>По данным Unity и СМИ, обнаруженная проблема позволяет злоумышленнику при определённых условиях выполнить код на машине пользователя и получить доступ к данным. Unity выпустила патчи и инструменты для разработчиков; тем, кто собирает проекты на старых редакторах, рекомендовано пересобрать и переиздать приложения на версиях редактора с исправлением (доступны через Unity Hub/Download Archive). Для тех, кто пока не готов к релизной пересборке, подготовлен пэтчер приложений для Android/Windows/macOS (ограничения: не работает с некоторыми сборками с античитами и tamper-защитой). Уязвимость получила высокий балл серьёзности (CVSS ~8.4) и связана с небезопасной загрузкой файлов/Local File Inclusion.</p><h2>Что предприняли платформы</h2><p>Партнёры Unity включили «надстройки безопасности» на своей стороне. Valve выпустила обновление Steam с мерами снижения риска, а Microsoft Defender получил сигнатуры для обнаружения и блокировки попыток эксплуатации. Google и Meta также добавили защитные механизмы. При этом нет признаков, что уязвимость затрагивает iOS, VisionOS, tvOS, Xbox, Nintendo Switch, PlayStation, UWP, Quest и WebGL.</p><h2>Как реагируют издатели и разработчики</h2><p>Ряд студий уже выпускают патчи или временно ограничивают доступность проектов, чтобы пройти проверку и обновление. В частности, из цифровых магазинов временно убирались некоторые игры Microsoft/Obsidian (например, Pentiment), а также проекты, получившие оперативные патчи, — Marvel Snap, No Rest for the Wicked, Ingress, Fate/Grand Order; Atlus сообщила об обновлении Persona 5: The Phantom X. В отдельных случаях под ограничения попадали даже нe-Unity-игры, если у них есть Unity-компоненты (цифровые артбуки, лончеры и пр.).</p><h2>Что делать разработчикам</h2><ul><li>Проверить, на каких версиях Unity Editor собраны релизные билды.</li><li>Пересобрать и переиздать приложения на версиях, содержащих исправления (или применить официальный пэтчер, если пересборка сейчас невозможна).</li><li>Сообщить игрокам о необходимости обновить игру/лаунчер и держать системы защиты в актуальном состоянии.</li></ul><p>Реальной эксплуатации уязвимости пока не зафиксировано, но уязвимость системная и давняя; чем быстрее разработчики выпустят обновления, тем меньше риск для игроков и партнёров по платформам.</p>]]></content:encoded>
    </item>
    <item>
      <title>JWT-токен в cookie в ASP.Net Core: максимальная безопасность и контроль</title>
      <link>https://tproger.ru/articles/jwt-token-v-cookie-v-asp-net-core--maksimalnaya-bezopasnost-i-kontrol</link>
      <comments>https://tproger.ru/articles/jwt-token-v-cookie-v-asp-net-core--maksimalnaya-bezopasnost-i-kontrol?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Белоусов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/jwt-token-v-cookie-v-asp-net-core--maksimalnaya-bezopasnost-i-kontrol</guid>
      <description><![CDATA[<p>В этом материале мы подробно рассмотрим механизм передачи JWT-токенов (JSON Web Token) через HTTP-Only cookie, который выводит безопасность и контроль над пользовательской сессией на новый уровень</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/jwt-token-v-cookie-v-asp-net-core--maksimalnaya-bezopasnost-i-kontrol">JWT-токен в cookie в ASP.Net Core: максимальная безопасность и контроль</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Информационная безопасность: веб-пентест]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 17 Sep 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>JWT-токены распространены, чтобы обеспечивать процессы авторизации и аутентификации между сервером и клиентами. Стандартная схема их использования включает в себя передачу токена через заголовок Authorization и обновление с использованием рефреш-токена и рефреш-эндпоинта.</p><p>Во
время аутентификации клиент получает от сервера токен и
должен его где-то сохранить, чтобы потом передавать серверу с каждым запросом.
Хранится токен в месте, доступном из JS кода, что порождает <a href="https://startx.team/blog/statyi/xss-ataka-chto-eto-takoe-i-kak-zashhititsya/">уязвимость к XSS
атакам</a>.
Кроме того, клиенту требуется реализовать логику рефреша.</p><p>Иногда в проекте
может возникнуть потребность в полном контроле над токеном со стороны сервера:
он должен иметь возможность не только проверить, но и обновить или отозвать
токен. В этом случае можно применять передачу JWT-токенов через HTTP-Only
cookie. Об этом — техлид IT_ONE Сергей Белоусов.</p><h3>Настройка контейнера ServiceCollection</h3><p>Рассмотрим на примере. Для добавления
работы с JWT-токенами через cookie в фреймфорке ASP.NET Core необходимо в
Program.cs добавить следующие строки</p><h3>Код контроллера для запуска и защиты сессии</h3><p>Разберём подробнее, что происходит при запуске аутентифицированной сессии. Клиент передаёт в запросе логин и пароль пользователя. Если условный сервис аутентификации _authService (реализацию оставляю за вами) подтверждает правильность введенных данных, то мы создаем JWT-токен и сохраняем его в cookie со следующими параметрами:</p><p>1) HttpOnly = true</p><p>Ключевая
настройка. Разрешает доступ к cookie только со стороны сервера, JS код не будет
иметь к ней доступ.</p><p>2) SameSite =
SameSiteMode.Strict</p><p>Запрещает
браузерам отправлять этот cookie при межсайтовых запросах. При необходимости можно
снизить до SameSiteMode.Lax, но это повысит уязвимость к XSRF атакам (о них
позже).</p><p>3) Secure = true</p><p>Cookie будет
отправляться только при соединении HTTPS.</p><p>4) Expires = DateTimeOffset.Now.AddMinutes(options.ExpirationTime)</p><p>Время жизни cookie
задаём таким же, как время жизни JWT-токена, потому что нет смысла хранить
токен дольше.</p><p>При логауте или
неправильных данных входа мы просто удаляем токен из cookies – по сути,
отзываем токен.</p><h3>Проверка токена через сервис JwtService</h3><p>Код JwtService:</p><p>В JwtService мы
создаем набор клеймов, которые хотим передавать с каждым запросом, и зашиваем
их в токен. В моём примере я решил сохранить в токен информацию о логине,
сессии и ролях пользователя.</p><h3>А что за antiForgeryToken?</h3><p>А вот и
отрицательная сторона использования cookie: уязвимости к XSRF-атакам. Если
кратко, то это вид атак, при которых злоумышленник заставляет браузер жертвы,
уже авторизованной на сайте, отправить нежелательный запрос на этот сайт от её
имени. Браузер автоматически добавляет авторизационный cookie к запросу, что
позволяет выполнить действия от имени жертвы.</p><p>Частично защиту от
XSRF атак повышает опция SameSite = SameSiteMode.Strict, но это <a href="https://www.dev-notes.ru/articles/security/csrf-bypassing-samesite-restrictions/">не панаце</a>я.
Также рекомендуют настраивать CORS-политики, но я оставлю эту тему за пределами
этой статьи (главное, не забыть AllowCredentials() на сервере и
WithCredentials() на клиенте).</p><p>Ещё один способ
защиты от XSRF атак – добавить ко всем запросам antiForgeryToken. В ASP.NET
Core MVC можно использовать services.AddAntiforgery(), тогда к каждой
форме на странице будет добавлено скрытое поле, которое заполняется сервером
при рендеринге страницы и отправляется при запросах на сервер. Но мне кажется,
что при использовании связки SPA + ASP.NET Core Backend готовый метод защиты не
применим, т.к. рендеринг страницы происходит на клиенте.</p><p>В своём проекте я
решил, что буду генерировать токен самостоятельно и возвращать его при успешной
аутентификации. Т.е. сам antiforgery токен может быть получен только тем, кто
знает логин и пароль. После этого токен сохраняется на клиенте и подставляется
в header при каждом запросе.</p><h3>Проверка antiForgeryToken</h3><p>Для проверки этого
токена используется middleware:</p><p>Сначала
определяется наличие AuthorizeAttribute, чтобы не проверять токен для анонимных
эндпоинтов. Затем вызывается CheckToken у самописного IAntiForgeryService.
Логику проверки можно реализовать любую. Например,  сгенерировать новый
токен по известным параметрам и сравнить с полученным от клиента. Если токены
не соответствуют — возвращаем код ошибки. Я выбрал 400, т.к. antiForgeryToken — это, по-моему, не про авторизацию,
поэтому не хотелось использовать 401 и 403.</p><h3>Абсолютная власть</h3><p>Главное
преимущество cookie — в том, что возможность управления JWT-токеном на стороне
сервера ограничена только вашей фантазией. Для себя я реализовал автоматический
рефреш JWT-токена при каждом запросе без необходимости отдельного рефреш
эндпоинта. Если для примера JWT-токен истекает через 15 минут, то при каждом
запросе от авторизованного пользователя я продлеваю токен ещё на 15 минут.</p><p>Логику обновления
можно менять под себя: например, ограничивать количество допустимых обновлений
в рамках сессии и т.д.</p><p>А также можно
написать другие middleware, которые в соответствии с бизнес-логикой будут
отбирать или выдавать роли или даже отзывать токен «на лету».</p><h3>Заключение</h3><p>Использование
HTTP-Only cookie для передачи JWT-токенов — это мощный паттерн, который
эффективно защищает от XSS-атак и предоставляет серверу беспрецедентный
контроль над сессией пользователя. Он позволяет реализовать такие функции, как
немедленный отзыв токенов и их прозрачное обновление, что значительно повышает
безопасность приложения. Однако этот подход требует тщательной реализации
дополнительных мер защиты от XSRF-атак и продуманной политики управления
жизненным циклом сессии. При грамотной настройке он становится надёжным
фундаментом для системы аутентификации в современных веб-приложениях.</p>]]></content:encoded>
    </item>
    <item>
      <title>OFFZONE 2025: LLM-агенты, фаззинг гипервизоров и секретные архивы кибербезопасности</title>
      <link>https://tproger.ru/articles/offzone-2025--llm-agenty--fazzing-gipervizorov-i-sekretnye-arhivy-kiberbezopasnosti</link>
      <comments>https://tproger.ru/articles/offzone-2025--llm-agenty--fazzing-gipervizorov-i-sekretnye-arhivy-kiberbezopasnosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/offzone-2025--llm-agenty--fazzing-gipervizorov-i-sekretnye-arhivy-kiberbezopasnosti</guid>
      <description><![CDATA[<p>Репортаж с OFFZONE 2025: LLM-агенты для реверса, фаззинг гипервизоров, новые техники атак и атмосфера секретного проекта в мире кибербезопасности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/offzone-2025--llm-agenty--fazzing-gipervizorov-i-sekretnye-arhivy-kiberbezopasnosti">OFFZONE 2025: LLM-агенты, фаззинг гипервизоров и секретные архивы кибербезопасности</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Информационная безопасность: веб-пентест]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Sep 2025 12:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Лев Прокопьев, технический директор PrivEsc.ru побывал на конференции по кибербезу OFFZONE. Эта статья его обзор трендов и тем, которые обсуждались на конференции.</i></p><p>Мой путь в кибербезопасности начался с пентеста и анализа защищённости, а последние два года я погрузился в мир компилируемых языков и разработки ИИ-агентов для защиты систем. На <a href="https://offzone.moscow/">OFFZONE</a> я не был с 2023 года, возвращение сюда оказалось особенно ценным: индустрия как всегда перевернулась несколько раз, приятно оказаться в гуще событий вновь. Атмосфера узнаваемая — всё в лучших традициях конференции.</p><h2>День первый</h2><p>21 августа 2025 года. Просыпаться в восемь утра человеку, чьи ночи принадлежат ошибкам компилятора, http-прокси и коротким видео в интернете, — жест аскетизма, достойный античного стоика. Чтобы избежать очередей, я вошёл через журналистский бейдж.</p><p>Бейдж <a href="https://offzone.moscow/">OFFZONE</a> — отдельная история. Это программируемое устройство: через коннекторы подключаешь модули — хоть фонарик, хоть динамик. Зарабатываешь офкоины, взламывая стенды или решая квесты, а потом тратишь на мерч. Инструмент для погружения, где мерцающий светодиод напоминает: ты внутри.</p><figure><img src="https://media.tproger.ru/user-uploads/116654/2025-08-29/09e69770-eef2-404e-9019-1e74012822da.png" alt="" /></figure><p>У каждого на OFFZONE своя цель: доклады, живое общение со спикерами, встреча коллег с прошлых проектов или адреналин от взлома стендовых систем. Ну и, конечно, соревнование «Hack in 15 minutes», где за ошибки наливают «горячительные напитки», а ведущие едко (но метко) шутят над участниками.</p><h3>Атмосфера</h3><figure><img src="https://media.tproger.ru/user-uploads/116654/2025-09-04/3088ac6f-9ade-42e1-a8e1-a9fb26473135.jpeg" alt="" /></figure><p>Оформление OFFZONE в этом году напоминало секретные архивы и закрытые исследовательские центры: печатные машинки, засекреченные досье, строки, закрашенные чёрным маркером. Всюду штампы «Секретно», ощущение тайного НИИ или новой реинкарнации марфинской шаражки, где ведут странные эксперименты. Главный маскот — Куб — выглядел как объект испытаний в лаборатории, к которому подпускают только по спецдопуску. Атмосфера будто ты стал участником секретного проекта, а сама конференция — это рассекреченный на пару дней доступ в закрытый мир.</p><p>Стоит рассказать и про OFFSTORE — фирменный магазин мерча. Лично мне, да и многим другим, он нравится именно потому, что тут делают не проходной ширпотреб, а реально качественные вещи с глубоким дизайном, вплетённым в тему года. Каждая коллекция вдохновлена атмосферой OFFZONE и продолжает её стиль, а не сводится к банальному логотипу на китайском рюкзаке. Материалы крепкие, от стирки не умирают, и смотрятся эти вещи не как «мерч для галочки», а как редкая и стильная шмотка, которую приятно носить и вне конференции.</p><h3>О выборе докладов и CFP</h3><p>OFFZONE декодируется как OFFENSIVE ZONE — и это чувствуется. Я пообщался с Михаилом Сидоруком, руководителем управления анализа защищенности BI.ZONE, директором по контенту конференции OFFZONE, и он рассказал, как отбирают доклады: оценивают новизну, глубину и наличие PoC. Фильтр жёсткий: отбрасывают маркетинг, «википедийные» доклады и серые обзоры. Шансы повышает уникальность темы, личный опыт или созданный автором рабочий инструмент — будь то утилита, скрипт или методика, которую можно использовать на практике.</p><h3>Доклады: от гипервизоров до дипфейков</h3><figure><img src="https://media.tproger.ru/user-uploads/116654/2025-08-29/238b94cf-ac68-49cd-9166-ceb3d32fcedb.png" alt="" /></figure><p>Не обошлось без фаззинга embedded-систем, графовых баз для анализа логических уязвимостей и новых методов SSTI-атак и серверных инъекций кода. А ещё — дипфейки, которые атакуют не только медиа, но и системы авторизации. После каждого выступления я ловил спикеров в кулуарах, чтобы спросить: как интегрировать их наработки в мой SAST/DAST, какие библиотеки выбрать, и где искать вдохновение для новых фич.</p><p>Тренды этого года — LLM и их применение, как контейнеризация когда-то. Кажется, все уже внедрили языковые модели в свои процессы, но спикеры показали, как выжать из них максимум: от автоматического поиска багов до генерации эксплойтов. Но на основной сцене были и классические темы наступательной кибербезопасности — и это радует. Глубокий разбор и критичность находок по-прежнему лучший способ эскалации рисков в ИБ.</p><p>Первым делом я попал на открытие — выступал Евгений Касперский — основатель и генеральный директор «Лаборатории Касперского». Если коротко, Kaspersky OS предлагают как способ логичного выхода из незавидного положения с безопасностью конечных устройств. Под капотом — изоляция процессов и приложений, что делает нерелевантными 99% типовых атак и даёт безопасную архитектуру для разработки ПО.</p><h3>Медиа-зона и квест для прессы</h3><p>После открытия меня проводили в отдельную комнату для прессы — уютное место, где я познакомился с другими представителями СМИ. На столах стояли кофе и закуски, но, как это обычно бывает, руки до них так и не дошли. Вместо этого нас ждал специальный квест: мы разделились на команды и отправились за баллами. Первое испытание — припаять светодиоды к маске анонимуса, превратив её в модуль для бейджа. Справился без проблем, даже сфоткался в специально выделенной зоне. На часы взглянул — пора на доклады. Чуть позже узнал, что наша команда пришла к разгадке первой.</p><h3>LLM и реверс</h3><p>Дальше я попал на доклад о LLM-агентах для реверса от Владислава Тушканова, руководителя группы Kaspersky MLTech, «Лаборатории Касперского». Один из наиболее интересных для меня: коллеги описали процесс разработки агентов на LangChain и smolagents. Сравнили результаты SaaS-нейросетей в прохождении crackme-лабораторий. Многие нейронки читерят, подсматривая ответы в интернете, но при помощи жёстко заданных инструкций это можно обойти. Определённо стоящий подход, достойный внедрения. 10 задач AI-агенты смогли решить. А у вас лично какой результат?</p><p>Был и доклад Руслана Махмудова, эксперта-исследователя по развитию сервисов анализа защищенности, BI.ZONE про использование графовых баз данных для RAG и поиска логических уязвимостей в веб-приложениях. BOLA и подобные баги часто доходят до продакшена. Масса многоступенчатых запросов с подписью затрудняет анализ, но LLM плюс графовые БД позволяют автоматизировать тестирование или подсветить потенциальный вектор атаки. Я и сам перевёз свой RAG с PostgreSQL на Neo4j сразу после OFFZONE.</p><p>Особо запомнился доклад Владислава Корчагина, независимого исследователя про SSTI-уязвимости и инструмент SSTImap. Простые на вид техники оказываются разрушительными. Инструмент автор интегрировал в AppSec и CI/CD для своевременного поиска багов, позволяющих выполнять команды на сервере.</p><h2>День второй: когда пентестерское нутро побеждает благие намерения</h2><p>Проснувшись ближе к обеду, я прибыл на конференцию и пошёл на самые жёсткие темы. Сначала — эскалация привилегий через забытую WinAPI-функцию, признанную уязвимостью за пару дней до доклада. Потом — фаззинг гипервизоров: QEMU, VirtualBox, KVM, разбор уязвимостей от автора CVE. Финал — классический дамп LSASS через физическую память в духе Physmem2profit. PoC не ждите, но техника жива и бодра.</p><p>Отдельно отмечу доклад Павла Блинникова, руководителя группы исследования уязвимостей, BI.ZONE: разбор фаззеров для гипервизоров и примеры эксплуатации заставили задуматься, сколько проектов можно было бы закрыть заранее. После такого даже VirtualBox выглядит как дверь с табличкой «ломайте здесь» — если знать, куда бить.</p><p>Составил два списка докладов с которыми стоит ознакомиться для разработчиков и пентестеров, но рекомендую читателям составить свой собственный список, без оглядки на меня.</p><h3>Доклады для разработчиков</h3><ul><li><a href="https://offzone.moscow/program/using-llms-to-automate-cybersecurity-expertise-detecting-malicious-code/">«LLM для автоматизации ИБ-экспертизы: обнаружение вредоносного кода» </a>— как встроить модели в пайплайн code-review.</li><li><a href="https://offzone.moscow/program/enabling-ai-to-understand-application-context-a-new-approach-to-detecting-business-logic-vulnerabili/">«Как научить AI понимать контекст приложения: новый подход к поиску уязвимостей бизнес-логики в API»</a> — graphRAG и поиск BOLA.</li><li><a href="https://offzone.moscow/program/how-we-built-one-of-the-best-sast-scanners-powered-by-an-llm/">«Как мы сделали один из лучших SAST на LLM»</a> — генерация PoC и фиксов прямо из кода.</li><li><a href="https://offzone.moscow/program/appsec-platform-evolution-from-manual-upload-to-ml-based-automation-and-validation/">«Эволюция платформы анализа кода: от ручной загрузки до ML-валидации»</a> — история построения SAST/DAST-платформы.</li><li><a href="https://offzone.moscow/program/successful-errors-new-code-injection-and-ssti-techniques/">«Успешные ошибки: новые техники code injection и SSTI»</a> — свежие паттерны для обнаружения дыр, которые SAST-коробки пропускают.</li><li><a href="https://offzone.moscow/program/pentesters-on-the-platform-now-they-write-the-same-and-that-s-good/">«Пентестеры на платформе: теперь они пишут одинаково (и это хорошо)»</a> — стандартизация инструментов для CI/CD и тестирования.</li><li><a href="https://offzone.moscow/program/you-may-not-rest-now-there-are-monsters-nearby/">«Вы не можете спать, пока рядом есть монстры» </a>— Игровые платформы и развившаяся в них теневая экономика.</li><li><a href="https://offzone.moscow/program/how-we-keep-our-monitoring-systems-healthy/">«SOC Check-Up. Как мы следим за здоровьем мониторингов» </a>— хорошая практика регулярной самооценки процессов.</li><li><a href="https://offzone.moscow/program/gitlab-defectdojo-ai-how-i-automated-bug-hunting-in-bug-bounty/">«GitLab + DefectDojo + AI: автоматизация поиска багов в bug bounty»</a> — готовый рецепт для интеграции баг-хантинга в dev-процесс.</li></ul><p>После таких докладов хочется пересмотреть весь свой код — и прогнать через свежие правила статического анализатора. Но главный вывод: современная разработка — это гонка вооружений, где каждая новая фича должна рождаться с встроенным антидотом.</p><h3>Доклады для пентестеров</h3><ul><li><a href="https://offzone.moscow/program/state-of-the-art-hypervisor-vulnerability-research/">«State-of-the-Art Hypervisor Vulnerability Research</a>» — атаки на QEMU, VirtualBox.</li><li><a href="https://offzone.moscow/program/successful-errors-new-code-injection-and-ssti-techniques/">«Успешные ошибки: новые техники code injection и SSTI»</a> — свежие паттерны для обнаружения дыр, которые SAST-коробки пропускают.</li><li><a href="https://offzone.moscow/program/sketching-out-reverse-socks-proxy-and-custom-transports-for-c2/">«К доске!» </a>— как нарисовать reverse SOCKS proxy и транспорт для вашего C2</li><li><a href="https://offzone.moscow/program/vulnerability-in-rockchip-bootrom/">«Уязвимость в Rockchip BootROM»</a> — баги загрузчиков и практическая эксплуатация.</li><li><a href="https://offzone.moscow/program/soc-exploitation-in-a-nutshell-unisoc-history/">«Эксплуатация SoC: история Unisoc»</a> — взлом систем-на-чипе, реверс железа.</li><li><a href="https://offzone.moscow/program/root-permissions-in-the-1c-infobase-with-a-single-line-of-code/">«Root-права в базе 1С за одну строку кода» </a>— типичный пример, как конфигурации ломают бизнес-ПО.</li><li><a href="https://offzone.moscow/program/silent-harvest-extracting-windows-secrets-under-the-radar/">«Silent Harvest: тихое извлечение секретов Windows»</a> — скрытые приёмы доступа к секретам ОС.</li><li><a href="https://offzone.moscow/program/embedded-code-greybox-fuzzing-made-easy-minimizing-the-prep-via-qiling/">«Greybox-фаззинг embedded через Qiling»</a> — быстрый старт фаззинга прошивок.</li><li><a href="https://offzone.moscow/program/making-a-path-to-multi-step-vulnerabilities/">«Протаптываем дорожку к multi-step-уязвимостям» </a>— как склеивать «несерьёзные» баги в цепочку до RCE.</li><li><a href="https://offzone.moscow/program/buried-in-the-log-exploiting-a-20-year-old-ntfs-vulnerability/">«Погребено в $LogFile:»</a> эксплуатация 20-летней уязвимости в NTFS</li></ul><p>Записи большей части докладов будут доступны на сайте OFFZONE c 11 cентября. Остальную часть докладов можно было послушать только на конференции.</p><h2>Финал</h2><p>OFFZONE — это не просто доклады, скорее тренировочный полигон. Здесь тестируешь свои знания, проверяешь стойкость идей и находишь инструменты, которые завтра могут спасти чей-то бизнес. Атмосфера секретного проекта, квесты, встречи с коллегами — всё это сливается в одну цель: выйти отсюда с чемоданчиком, в котором чуть больше киберинструментов, чем раньше.</p>]]></content:encoded>
    </item>
    <item>
      <title>6 советов, которые реально прокачают навыки работы с Docker</title>
      <link>https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker</link>
      <comments>https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker</guid>
      <description><![CDATA[<p>Шесть практик, которые прокачают навыки работы с Docker: минимизация образов, ручная сборка, sandbox-подход, нестандартная контейнеризация и отказ от Docker CLI.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker">6 советов, которые реально прокачают навыки работы с Docker</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 03 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Docker давно стал стандартом в разработке: контейнеры запускают фронтенд, бэкенд, базы данных, пайплайны и тесты. Но большинство разработчиков использует его как ещё один способ запустить проект, не вдаваясь в детали. А ведь за docker build и docker run скрывается целая экосистема. Сегодня рассмотрим шесть практик, которые реально прокачают навыки работы с Docker.</p><h2>Сделайте минимальный Docker-образ, не ломая прод</h2><p>Большинство Docker-образов в проектах содержат больше данных, зависимостей и инструментов, чем требуется для работы приложения. Это приводит к избыточному объёму, медленной сборке и повышенным рискам безопасности. Умение собирать минимальный образ — один из базовых навыков работы с Docker, который напрямую влияет на стабильность и скорость развёртывания.</p><p>Начать стоит с multi-stage сборки: на первом этапе — установка зависимостей и сборка, на втором — только нужные артефакты. Это позволяет исключить лишние файлы и утилиты из финального образа. В качестве базового слоя лучше использовать alpine, distroless или даже scratch, если вы точно понимаете, какие бинарники и библиотеки требуются приложению.</p><p>Хорошая практика — использовать утилиты docker history и dive для анализа того, какие файлы и слои попали в образ. Если размер превышает ожидания, стоит проверить, не остались ли во внутреннем слое временные файлы, dev-зависимости или директории кэша.</p><p>Полезный навык — намеренно уменьшить образ до минимума и посмотреть, на каком этапе он перестанет работать. Это позволяет выявить неочевидные зависимости, которые могут мешать переносимости и воспроизводимости. Например, отсутствие системной библиотеки, необходимость в переменных окружения или некорректная настройка путей.</p><p>Результат — меньше уязвимостей, быстрая сборка и уверенность в том, что образ содержит только то, что действительно нужно для запуска в проде.</p><h2>Попробуйте контейнизировать то, что изначально не предназначалось для этого</h2><p>Работа с Docker чаще всего начинается с бэкенд-приложений, сервисов и утилит, которые изначально проектировались как самостоятельные процессы. Они хорошо вписываются в модель контейнеров: запускаются из CLI, работают в изоляции, не требуют доступа к UI или железу. Но стоит выйти за эти рамки — начинаются сложности.</p><p>Попробуйте упаковать в контейнер любую графическую программу. Технически это возможно: X11 или Wayland можно пробросить через сокет, устройства передать через volume, окружение прописать вручную. Но на практике вы столкнётесь с рядом ограничений: отсутствие звука, глюки интерфейса, ошибки в драйверах, проблемы с доступом к GPU или нестабильное поведение при рендеринге.</p><p>В этом упражнении ценен не сам результат, а путь. Вы увидите, как устроена изоляция в Docker, почему графические приложения не работают «из коробки» и где находятся реальные границы контейнеризации. Контейнер — это не виртуальная машина, у него нет полноценного init, драйверов или прямого доступа к оборудованию. Многие фичи, которые работают локально, в контейнере требуют дополнительных танцев с бубном.</p><p>Такая практика особенно полезна, если вы имеете дело с devtool'ами, UI-обвязкой или тестированием в headless-средах. Понимание, что именно ломается и почему, позволяет более точно проектировать окружение и избегать архитектурных ловушек в будущем.</p><h2>Соберите базовый образ с нуля</h2><p>Когда разработчик пишет FROM node или FROM ubuntu, он автоматически получает десятки слоёв, библиотек и утилит, о которых, скорее всего, не задумывается. Это удобно, но не даёт понимания, как вообще работает контейнер на низком уровне. Попробуем разобраться.</p><p>Укажите в Dockerfile FROM scratch — и не увидите ни bash, ни glibc, ни стандартных каталогов. Вам придётся самостоятельно добавить всё необходимое: бинарник, зависимости, библиотеки, конфигурацию. Если пишете на Go, задача упрощается: можно собрать статически слинкованный исполняемый файл и скопировать его в образ. Для других языков, особенно тех, что зависят от динамических библиотек или рантайма (например, Python или Node.js), придётся вручную подтягивать зависимости.</p><p>Такая практика заставляет иначе взглянуть на структуру контейнера. Вы начнёте понимать, чем отличается CMD от ENTRYPOINT, зачем в некоторых образах используется sh -c, и что произойдёт, если не задать WORKDIR. Вы столкнётесь с ошибками «no such file or directory» даже тогда, когда файл вроде бы существует — потому что в контейнере не хватает нужной libc.</p><p>Отдельный повод для размышлений — Alpine. Его любят за размер и минимализм, но он использует musl вместо glibc, и не всё с ним работает корректно. В процессе сборки на практике увидите, почему иногда проще остаться на Debian Slim, чем пытаться адаптировать всё под Alpine.</p><p>Этот эксперимент не нужен для продакшена — он нужен вам, как разработчику. Прокачивает понимание, как устроен Docker, что по-настоящему важно приложению для запуска, и какие зависимости вы добавляете бессознательно.</p><h2>Делайте разные варианты Docker-образов</h2><p>Хороший Dockerfile — тот, который гибко адаптируется под разные сценарии: продакшен, отладку, тестирование, запуск на ARM или x86. Если вы умеете собирать только один универсальный образ — вы ещё не освоили Docker по-настоящему.</p><p>Попробуйте собрать сразу несколько версий своего образа: на Debian и на Alpine, с минимальным размером и с полным набором утилит, для amd64 и arm64. Добавьте build-аргументы (ARG) — они позволяют передавать параметры на этапе сборки: выбрать базовый образ, включить или выключить зависимости, задать переменные окружения. Используйте RUN if или шаблонизацию через Dockerfile.template, чтобы варьировать поведение без дублирования кода.</p><p>Вот типичный пример: в режиме отладки вам нужен образ с установленным curl, vim, доступом к логам и расширенной трассировкой. А в продакшене — максимально облегчённый, с удалёнными временными файлами, сжатым слоем и только необходимыми бинарниками. Один и тот же проект — два разных образа. Добавьте сюда ещё поддержку разных архитектур (multi-arch build через --platform), и вы выйдете на уровень CI/CD, где из одного пайплайна собирается три-четыре артефакта.</p><p>Такая практика решает сразу несколько задач. Во-первых, помогает лучше понять, как влияет каждый шаг сборки на финальный размер и поведение контейнера. Во-вторых, избавляет от лишних костылей, когда на проде всё работает, а на локалке — нет. И главное — прокачивает навык автоматизации. Один Dockerfile, разные образы, ноль копипасты.</p><h2>Поиграйте в «А что если запустить чужой (небезопасный) код?»</h2><p>Представьте задачу: вам нужно запустить код, который написал кто-то другой. Вы не уверены, что он безопасен. Это может быть скомпилированный бинарник, питоновский скрипт или даже npm-зависимость с подозрительным хуком. Где-то в коде может быть rm -rf /, попытка выйти за пределы контейнера, установить рутовый доступ или просто майнить крипту. И теперь этот код запускается на вашей машине — внутри Docker.</p><p>Кажется, контейнер защитит? Не всегда.</p><p>Docker не является полноценной песочницей. По умолчанию контейнер может обращаться к файловой системе, к ядру и к хостовым ресурсам — особенно если вы запускаете его                 с --privileged или без ограничения пользователя. Даже docker run -it ubuntu работает от root внутри контейнера, что уже создаёт риски.</p><p>Если вы действительно хотите запустить небезопасный код, нужно жёстко ограничить контейнер:</p><ul><li>отключить права root (через --user);</li></ul><ul><li>запретить модификацию файловой системы (--read-only);</li></ul><ul><li>отобрать лишние возможности ядра (--cap-drop=ALL);</li></ul><ul><li>включить seccomp-профиль, AppArmor или SELinux;</li></ul><ul><li>отключить доступ к сети или монтированию сокетов.</li></ul><p>Список можно продолжать. Главное — понять, что Docker по умолчанию не даёт изоляции на уровне VM. Если вы работаете с кодом, которому не доверяете, этого может быть недостаточно.</p><p>Это упражнение учит думать о безопасности как о процессе. И особенно важно пройти его, если вы когда-нибудь планируете запускать user-generated code: плагины, кастомные скрипты, пайплайны CI. Только на практике становится ясно, где заканчиваются возможности Docker и начинаются границы настоящей песочницы.</p><h2>Работайте без Docker CLI</h2><p>Если убрать Docker CLI — что останется? Больше, чем кажется.</p><p>Docker ― это не единый монолит. Он работает поверх набора инструментов и стандартов: buildkit, containerd, спецификация OCI. CLI просто прячет эту архитектуру за удобными командами: docker build, docker run, docker push. Но всё, что кажется магией, можно повторить вручную.</p><p>Попробуйте отказаться от docker как от инструмента. Сконфигурируйте buildctl напрямую и соберите образ без Dockerfile. Или вообще создайте его вручную: сформируйте структуру, описания слоёв, метаданные, манифест. Прочитайте спецификацию <a href="https://github.com/opencontainers/image-spec">OCI Image Format </a>и идите по ее шагам. Понадобится tar, sha256sum, немного JSON — и внимательность.</p><p>Образ собрали? Отлично. Теперь отправьте его в реестр без docker push. Используйте oras, skopeo или curl с аутентификацией и ручной отправкой слоёв по HTTP API. Узнаете много нового: как работает digest, что такое manifest list и зачем нужны media types.</p><p>Наконец, запустите контейнер без docker run. Через ctr, runc или даже напрямую с помощью systemd-nspawn.</p><p>Зачем это нужно? Чтобы воспринимать Docker глубже. Так, вы понимаете, как устроен pipeline сборки и запуск контейнера, и точнее управляете им. Особенно это важно в продакшн-среде: когда образы не собираются, push падает, реестр отвечает 403, а пайплайн горит.</p><p>Ты точно программист, если читаешь это! Больше мемов, инсайтов и боли кодеров <a href="https://t.me/+ajgz7pDecB4xZTI6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>JavaScript: большой гайд от Tproger</title>
      <link>https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger</link>
      <comments>https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger</guid>
      <description><![CDATA[<p>Гайд по JavaScript. Топовые и полезные статьи с теорией, инструментами и фреймворками. Практика для новичков и продвинутых программистов.  ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger">JavaScript: большой гайд от Tproger</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 08 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>JavaScript — база веб-разработки. На нем пишут интерактивные веб-интерфейсы, динамичные приложения и серверные фичи. В общем, на JS можно делать все — от простых скриптов до сложных экосистем. В этом гайде собрали статьи для новичков и не только, которые помогут прокачаться в JavaScript.</p><h2>База и теория</h2><ol><li><a href="https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera">Event loop для чайников: простыми словами о сложном механизме браузера</a> — В статье разбираем, что такое Event Loop, очередь задач и стек вызовов. Простыми словами о том, как браузер выполняет JavaScript-код и обрабатывает события.</li><li><a href="https://tproger.ru/articles/chek-list-dlya-node-js-novichkov--obrabotka-owibok-254149">Чек-лист по Node.js для новичков: обработка ошибок</a> — Показываем основные подходы к обработке ошибок для Node.js. Рассматриваем пошаговую инструкцию и практические примеры.</li><li><a href="https://tproger.ru/articles/znaniya--kotorymi-dolzhen-obladat-javasript-razrabotchik-v-2024-godu--eto---baza">Что нужно учить JavaSript-разработчикам в 2024 году</a> — Разбираем, какие технологии и навыки нужно знать JS-разработчику, в том числе и в 2025. От фреймворков до подходов к архитектуре.</li><li><a href="https://tproger.ru/articles/deklarativnyj-javascript">Декларативные языки на примерах с JavaScript</a> — Рассказываем, что значит декларативный стиль программирования. Сравниваем с императивным на примерах JavaScript.</li><li><a href="https://tproger.ru/articles/javascript-localstorage-polnoe-rukovodstvo">JavaScript localStorage: Полное руководство</a> — Разбираем, как работает localStorage. Учим сохранять данные на клиенте с помощью JavaScript.</li><li><a href="https://tproger.ru/articles/ponimanie-strogogo-rezhima-javascript">Как работает режим strict в JavaScript</a> — Объясняем, что делает режим strict и почему он помогает писать более безопасный код на JavaScript.</li><li><a href="https://tproger.ru/articles/kak-besplatno-vyuchit-javascript-i-ne-idti-v-onlajn-wkoly">Как бесплатно выучить JavaScript и не идти в онлайн-школы</a> — Рассказываем, как самостоятельно освоить JavaScript. Бесплатные ресурсы, полезные советы и личный план обучения.</li><li><a href="https://tproger.ru/articles/kakie-js-biblioteki-ispolzovat-dlya-animacij-na-sajte-v-2024-godu">Какие JS-библиотеки использовать для анимаций на сайте в 2024 году</a> — Актуальные JavaScript-библиотеки для веб-анимации. Рассматриваем лучшие инструменты для красивых и быстрых интерфейсов.</li></ol><h2>Практикуемся</h2><ol><li><a href="https://tproger.ru/articles/10-realnyh-voprosov-s-sobesedovaniya-javascript-razrabotchika-s-otvetami-254156">10 реальных вопросов с собеседования JavaScript-разработчика с ответами</a> — Подборка реальных вопросов с собеседований для JavaScript-разработчиков. Даем ответы и объясняем, как правильно мыслить на интервью.</li><li><a href="https://tproger.ru/articles/prilozhenie-dlya-prognoza-pogody-na-vue-js">Приложение прогноза погоды с использованием Vue JS</a> — Пошаговое руководство по созданию погодного приложения на Vue.js. Обучаем взаимодействию с API и построению интерфейса.</li><li><a href="https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript">Математика в программировании: реализуем уравнения на JavaScript</a> — Объясняем, как реализовать математические уравнения на JavaScript. Практика для программистов, которые не боятся формул.</li><li><a href="https://tproger.ru/articles/regulyarnye-vyrazheniya-v-javascript-eto-ne-tak-strawno-kak-vy-dumaete">Регулярные выражения в JavaScript: разбираемся в создании</a> — Учим создавать и использовать RegExp в JavaScript. Поясняем синтаксис, паттерны и типовые ошибки.</li><li><a href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja">Решаем популярные задачи с асинхронным кодом на JavaScript: часть первая</a> — Практика асинхронного программирования на JavaScript. Решаем задачи с API, задержками и промисами.</li><li><a href="https://tproger.ru/articles/tutorial-po-javascript-async-x2f-await-izuchaem-callbacks-promises-i-async-x2f-await">Асинхронный JavaScript: изучаем Async/Await, Callbacks и Promises</a> — Учим писать асинхронный код в JavaScript: от колбэков до современного async/await. Понятно, на примерах и без лишнего.</li><li><a href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja">Задачи по асинхронному программированию на JS</a> — Упражнения на асинхронный JavaScript. От простых примеров до сложных сценариев.</li></ol><p>Предыдущие подборки лежат здесь: <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильная разработка</a>, <a href="https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger">С++</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">инструменты</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как настроить аутентификацию в веб-приложениях на Django</title>
      <link>https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django</link>
      <comments>https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django</guid>
      <description><![CDATA[<p>Аутентификация в веб-приложениях на Django. Показываем основные варианты настройки. Рассматриваем пошаговую инструкцию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django">Как настроить аутентификацию в веб-приложениях на Django</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Dec 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Во время аутентификации происходит проверка пользователя: учетные данные сопоставляются с теми, что хранятся в системе. Если указана неверная комбинация логина и пароля, доступ к функционалу веб-приложения будет ограничен.</p><p>Такой механизм реализован и на сайте Tproger: читатели не могут создавать, комментировать и лайкать посты, пока не пройдут аутентификацию.</p><h2>Базовая аутентификация в Django</h2><p><a href="https://tproger.ru/tag/django">Фреймворк Django</a> выбирают для аутентификации из-за его встроенной, безопасной и гибкой системы управления пользователями. Это готовые инструменты для регистрации, авторизации и настройки прав доступа, включая защиту от основных типов атак, безопасное хранение паролей и управление сессиями. При этом в Django система аутентификации легко настраивается под нужды проекта, подробно документирована и регулярно обновляется.</p><p>Установим фреймворк командой pip:</p><p>Создадим новый проект:</p><p>Создадим новое приложение для работы с аутентификацией:</p><p>Django уже содержит встроенную систему аутентификации. Она находится в приложении django.contrib.auth, которое по умолчанию включено в INSTALLED_APPS в файле settings.py.</p><p>Добавим приложение в список INSTALLED_APPS:</p><h2>Добавление и настройка страниц для входа, регистрации и выхода</h2><p>Используем встроенные формы Django, чтобы настроить аутентификацию. Сначала создадим поля для входа и регистрации в файле forms.py приложения myapp:</p><p>Код выше создает две формы: LoginForm для входа и RegisterForm для регистрации нового пользователя.</p><p>Форма <b>LoginForm </b>содержит два поля: username и password. Поле password отображается как поле ввода пароля с помощью виджета PasswordInput.</p><p>Форма <b>RegisterForm </b>наследуется от встроенной формы UserCreationForm и добавляет дополнительное поле email. В классе Meta указываем модель User и поля, которые нужно включить в форму.</p><p>Создадим представления для обработки запросов входа, регистрации и выхода. В файле views.py приложения myapp добавим код:</p><p>Код выше создает три функции представления: <b>login_view</b>, <b>register_view </b>и <b>logout_view</b>.</p><p>Функция <b>login_view </b>обрабатывает запрос входа пользователя. Для POST-запроса создается экземпляр формы LoginForm с переданными данными. Если форма валидна, извлекаются имя, пароль и выполняется аутентификация пользователя с помощью функции authenticate(). Если пользователь успешно аутентифицирован, выполняется вход login(), и пользователь перенаправляется на главную. Для GET-запроса, создается пустая форма LoginForm, которая передается в шаблон login.html.</p><p>Функция <b>register_view </b>обрабатывает запрос регистрации.</p><ul><li>Если это POST-запрос, создается экземпляр формы RegisterForm с переданными данными.</li><li>Если форма валидна, новый пользователь сохраняется в базе данных с помощью метода save(), и перенаправляется на страницу входа.</li><li>Если это GET-запрос, создается пустая форма RegisterForm, которая передается в шаблон register.html.</li></ul><p>Функция logout_view<b> </b>обрабатывает запрос завершения сессии. Она вызывает функцию logout() для выхода пользователя, и перенаправляет его на страницу входа.</p><p>Создадим шаблоны login.html, register.html и добавим ссылку на выход в шаблоне base.html:</p><p>В шаблоне base.html добавляем условие {% if user.is_authenticated %} — оно проверит, авторизован ли пользователь. Если авторизован, отобразится приветствие и ссылка на выход. Если не авторизован, то появятся ссылки на страницы входа и регистрации.</p><p>Обновим файл urls.py приложения myapp, чтобы добавить маршруты для новых представлений:</p><p>Запустим сервер, чтобы протестировать вход и регистрацию:</p><p>Страницы размещаются по адресу http://localhost:8000/login/ и http://localhost:8000/register/ соответственно.</p><p>В Django также есть встроенные классы представлений для аутентификации, такие как LoginView и LogoutView. Чтобы использовать их, обновим файл urls.py приложения myapp:</p><p>Заменили функцию представления login_view на класс представления LoginView и указали шаблон login.html. Аналогично, заменили функцию представления logout_view на класс представления LogoutView и указали страницу, на которую будет перенаправлен пользователь после выхода (next_page='login').</p><h2>Управление доступом с помощью авторизации</h2><p>Один из распространенных способов ограничения доступа — использование декоратора <b>@login_required</b>. Его можно применять к функциям представления, чтобы разрешить доступ только авторизованным пользователям.</p><p>Для использования декоратора @login_required обновим файл settings.py и укажем URL-адрес для перенаправления неавторизованных пользователей:</p><p>Теперь в файле views.py приложения myapp добавим следующий код:</p><p>Код создает функцию представления home_view, которая отображает главную страницу сайта. Применяем декоратор @login_required к этой функции, чтобы разрешить доступ только авторизованным пользователям.</p><p>Создадим шаблон home.html в директории templates приложения myapp:</p><p>Добавим путь для главной страницы в файле urls.py приложения myapp:</p><p>Если неавторизованный пользователь попытается получить доступ к главной странице, он будет перенаправлен на страницу входа.</p><p>В Django есть система разрешений (permissions) для расширенного управления доступом. С их помощью можно определять, какие действия могут выполнять пользователи или группы пользователей.</p><p>Создадим группу и назначим ей разрешения. В файле admin.py приложения myapp добавим следующий код:</p><p>Создадим функцию представления, которая будет доступна только пользователям с определенным разрешением. В файле views.py приложения myapp добавим код:</p><p>Создаем функцию представления special_page_view, которая отображает специальную страницу. Применяем декоратор @permission_required к этой функции и указываем необходимое разрешение myapp.view_special_page. Только пользователи или группы с этим разрешением смогут получить доступ к данной странице.</p><p>Создадим шаблон special_page.html в директории templates приложения myapp:</p><p>Добавим маршрут для специальной страницы в файле urls.py приложения myapp:</p><p>Теперь только пользователи или группы с разрешением myapp.view_special_page смогут получить доступ к специальной странице.</p><h2>Расширение модели пользователя</h2><p>Можно создать собственную модель пользователя, наследуя от AbstractUser или AbstractBaseUser.</p><p>Давайте ассмотрим создание кастомной модели пользователя с помощью AbstractUser. В файле models.py приложения myapp добавим код:</p><p>Создаем класс CustomUser, который наследуется от AbstractUser. Добавляем дополнительные поля phone_number и address к модели пользователя.</p><p>Обновим файл settings.py и укажем кастомную модель:</p><p>С этого момента система аутентификации будет использовать кастомную модель пользователя вместо встроенной модели User.</p><p>Создадим миграции и применим их для обновления базы данных:</p><p>Для работы с кастомной моделью нужно обновить формы. В файле forms.py приложения myapp изменим поля регистрации:</p><p>Создаем класс CustomUserCreationForm, который наследуется от UserCreationForm. Добавляем поля phone_number и address к форме и указываем кастомную модель CustomUser в классе Meta.</p><p>Чтобы система аутентификации приняла изменения, обновим функцию представления register_view в файле views.py:</p><p>Меняем форму UserCreationForm на кастомную форму CustomUserCreationForm. Теперь Django работает, используя собственную модель пользователя с дополнительными полями во всем проекте.</p><h2>Социальная аутентификация</h2><p>Для реализации входа через сторонние сервисы есть библиотека django-allauth. Она предоставляет готовые решения для интеграции с провайдерами социальной аутентификации.</p><p>Установим библиотеку django-allauth:</p><p>Добавим django-allauth в список установленных приложений в файле settings.py:</p><p>Добавляем приложения django.contrib.sites, allauth и провайдеры социальной аутентификации, которые хотим использовать. В нашем случае это интеграция Google.</p><p>Также устанавливаем значение SITE_ID = 1, чтобы указать идентификатор сайта.</p><p>Добавим URL-адреса для django-allauth в файле urls.py проекта:</p><p>Включаем URL-адреса django-allauth с префиксом accounts/.</p><p>Выполним миграции для создания таблиц в базе данных:</p><p>После этого можно настраивать провайдеров социальной аутентификации через административный интерфейс Django.</p><p>Добавим кнопки для социальной аутентификации на страницу входа. В шаблоне login.html добавим следующий код:</p><p>Добавляем ссылки на страницы регистрации через социальные аккаунты, используя URL-адреса socialaccount_signup с указанием провайдера. Теперь пользователи могут войти на сайт, используя свою учетную запись Google.</p><h2>Безопасность аутентификации</h2><p>Рекомендации по повышению безопасности аутентификации:</p><ul><li>Настройте SSL/TLS-сертификат для сайта для безопасного соединения между клиентом и сервером. Используйте протокол HTTPS для всех страниц, где есть аутентификации и передача конфиденциальных данных.</li><li>Система на Django работает со встроенной защитой от межсайтовой подделки запросов (CSRF). Убедитесь, что в шаблонах форм используется тег {% csrf_token %}.</li><li>Экранируйте пользовательский ввод перед его выводом на страницах сайта, чтобы защититься от межсайтового скриптинга (XSS). Django автоматически экранирует переменные в шаблонах, но будьте осторожны при явном выводе HTML.</li><li>Для защиты от атак методом перебора (брутфорса) ограничьте количество неудачных попыток входа для каждого пользователя или IP-адреса. Используйте библиотеки django-axes или django-ratelimit, чтобы реализовать ограничения числа попыток входа.</li><li>Никогда не храните пароли в открытом виде — вместо этого используйте хеш-функции. В Django есть встроенные функции для хеширования паролей: django.contrib.auth.hashers.make_password() и django.contrib.auth.hashers.check_password().</li><li>Возможно, стоит реализовать двухфакторную аутентификацию, чтобы повысить безопасность учетных записей. Используйте библиотеки django-two-factor-auth или django-otp для добавления 2FA.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>OAuth 2.0 и OIDC: как защитить API и пользовательские данные</title>
      <link>https://tproger.ru/articles/oauth-2-0-i-oidc--kak-zashhitit-api-i-polzovatelskie-dannye-253181</link>
      <comments>https://tproger.ru/articles/oauth-2-0-i-oidc--kak-zashhitit-api-i-polzovatelskie-dannye-253181?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/oauth-2-0-i-oidc--kak-zashhitit-api-i-polzovatelskie-dannye-253181</guid>
      <description><![CDATA[<p>Григорий Миронов, Senior Backend Developer в Почте Mail.ru рассказывает, что такое OAuth 2.0 и OIDC и как безопасно настроить токены</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/oauth-2-0-i-oidc--kak-zashhitit-api-i-polzovatelskie-dannye-253181">OAuth 2.0 и OIDC: как защитить API и пользовательские данные</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 04 Dec 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Протоколы OAuth 2.0 и OpenID Connect (OIDC) — база для управления доступом и аутентификации, и их правильная реализация требует внимания к деталям. Вместе с <a href="https://h.careers/curators/grigoriiy-mironov">Григорием Мироновым</a>, Senior Backend Developer в Почте Mail.ru и ментором <a href="https://h.careers/skills?utm_source=site_tproger&amp;utm_medium=article">Эйч Навыки</a>, разбираемся, как использовать эти инструменты максимально эффективно и безопасно.</p><h2>Что такое OAuth 2.0 и OIDC</h2><p>OAuth2 — это широко распространенный протокол авторизации, который позволяет различным системам взаимодействовать и обмениваться данными с разрешения пользователя. Полное описание протокола зафиксировано в виде <a href="https://datatracker.ietf.org/doc/html/rfc6749">RFC-6749</a>.</p><p>OIDC — это, можно сказать, надстройка над OAuth2, добавляющая к протоколу механизмы идентификации пользователя, что позволяет проводить не только авторизацию, но и идентификацию конкретного пользователя в системе. Например, OIDC широко распространен в системах <a href="https://datatracker.ietf.org/doc/html/rfc7642#page-12">SSO (SIngle Sign On)</a>.</p><h2>Токены и их безопасность</h2><p>Токены — центральный элемент протоколов OAuth 2.0 и OIDC, которые позволяют безопасно авторизовать пользователей и передавать данные между системами. Однако их неправильная настройка или использование могут создать серьезные риски безопасности. Ниже — о типах токенов.</p><h4>Access-токены (токены доступа)</h4><ul><li>Назначение: предоставляют доступ к функционалу системы.</li><li>Срок жизни: в большинстве случаев 1 час или меньше. Обычно этого хватает, чтобы защититься от перебора токенов.</li><li>Область действия: определена через scope — набор разрешений, доступных с этим токеном.</li></ul><h4>Refresh-токены</h4><ul><li>Назначение: используются для получения нового access-токена, когда срок действия последнего истекает.</li><li>Срок жизни: либо не ограничивается, либо выставляется достаточно большим, чтобы пользователю не нужно было регулярно подтверждать выдачу новой пары access и refresh-токенов. В любом случае у пользователя должна быть возможность отозвать этот доступ в ручном режиме.</li></ul><p><b>Работает примерно так:</b></p><ul><li>access-токен выдан на 1 час, после этого доступ к системе будет отозван</li><li>по истечении часа клиент обращается к системе с refresh-токеном, чтобы получить новый access-токен и продолжить работу</li></ul><p>Одно из основных преимуществ OIDC перед OAuth2 — поддержа передачи минимального набора информации о владельце аккаунта (обычно это email, username, имя и фамилия), что позволяет построить систему аутентификации поверх данного протокола. Для передачи подобных данных существует 2 механизма:</p><ul><li>Метод GET /userinfo, находящийся в авторизованной зоне (это значит, что получить данные об аккаунте может только тот, кому пользователь сам предоставил доступ к ним);</li><li>ID-токен, передаваемый при аутентификации вместе с access и refresh-токенами. Этот механизм является предпочтительным, так как позволяет не выполнять лишнее обращение к серверу. Живет не больше 5 минут.</li></ul><p>Согласно спецификации OIDC, ID-токен — это JWT, обычно подписанный с использованием ассиметричного шифрования, чтобы предотвратить подмену данных аккаунта.</p><p>Никогда не используйте ID-токены как access- или refresh-токены. Это небезопасно, так как они содержат данные о пользователе.</p><p>Спецификация и полное описание JWT токенов описана в <a href="https://datatracker.ietf.org/doc/html/rfc7519">RFC-7519</a>. Основная идея заключается в создании некоторого механизма безопасной и не слишком затратной с точки зрения сетевых ресурсов передачи данных между несколькими системами.</p><p>JWT представляет собой JSON, опционально подписанный с помощью асимметричного шифрования посредством JWK. Это позволяет проверить подлинность данных, содержащихся в JWT. Кроме того, спецификация предусматривает указание времени жизни такого токена, а также дополнительной информации.</p><p>Вот пример структуры JWT:</p><h3>Как безопасно хранить и передавать токены</h3><blockquote>Правило № 1: клиенты никогда не будут безопасными. Без шуток — доверять можно только своему серверу (и то не всегда).<br /></blockquote><p>Вот основные пункты, которым нужно следовать:</p><ol><li>Для взаимодействия используйте только HTTPS, иначе никакие хитрости вам не помогут.<br /></li><li>По возможности ограничивайте время жизни токенов — это снизит риск компрометации.<br /></li><li>Храните токены: 1) в защищенных хранилищах: <a href="https://developer.android.com/reference/java/security/KeyStore">KeyStore (Android)</a>, Secure Enclave (iOS) или <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#httponly">HttpOnly Cookies (браузеры)</a>, 2) с дополнительным шифрованием (например, AES) — это повысит защиту.</li><li>Избегайте XSS-атак: внедрение вредоносных скриптов остается одной из главных угроз токенам.</li></ol><p>Не передавайте токены там, где они не нужны: это минимизирует риск утечки данных.</p><h2>Как настроить аутентификацию и авторизацию</h2><h3>CSRF-атаки и защита через state</h3><p>Еще в RFC-6749 был предложен механизм защиты от CSRF-атак — использование параметра state (в OIDC его аналог — nonce). Это случайная строка, уникальная для каждого запроса:</p><ul><li>Клиент генерирует state и передает его серверу.</li><li>Сервер возвращает его в ответе. Клиент проверяет, совпадает ли значение.</li></ul><p>Этот подход защищает от подмены запросов, связывая только два шага:</p><ol><li>Запрос на авторизацию.</li><li>Редирект в API клиента с авторизационным кодом.</li></ol><h3>PKCE: защита этапа обмена токенов</h3><p>Чтобы связать оставшиеся шаги (обмен кода авторизации на токены) и усилить безопасность, был введен PKCE (RFC-7636). Этот механизм работает так:</p><ol><li>Клиент генерирует случайную последовательность байт (code_verifier) и вычисляет её хэш (code_challenge).</li><li>При запросе авторизации клиент передает code_challenge серверу, который его запоминает.</li><li>При обмене авторизационного кода на токены клиент отправляет исходный code_verifier, а сервер проверяет его соответствие ранее переданному code_challenge.</li></ol><p>Важно! Использование PKCE и state — обязательное требование для современного веба.</p><h2>Какой способ авторизации без сервера наиболее безопасный</h2><blockquote>Любая логика аутентификации и авторизации, исполняемая на клиентской машине, небезопасна. Это в буквальном смысле лакомый кусок, который схватят при первой возможности.</blockquote><p>В случае SPA и аналогичных решений, в протоколе пришлось сделать послабление. Так как хранение client-secret на клиентской машине не имеет смысла, провайдер может только идентифицировать клиентское приложение только по client-id, что снижает безопасность. Единственное, что позволяет предотвратить несанкционированный доступ — redirec_url, который задает список доверенных URL для редиректов в процессе авторизации.</p><p>Иногда вместо классического Authorization Code flow (выдача кода и обмен последнего на токены) используют упрощенный Implicit Flow, но из-за некоторых допущений он значительно снижает безопасность, поэтому многие популярные решения (например, <a href="https://www.keycloak.org/">Keycloak</a>) и провайдеры его не поддерживают, так что остается только классический Authorization Code Flow.</p><p>Если говорить о реализации OAuth2 в SPA, точно стоит озадачиться безопасностью вашего домена — не забывать про state, PKCE, поскольку по сути это единственное, что отделяет вас от хаоса.</p><p>Кроме того, клиентское приложение в процессе авторизации должно будет выполнить POST-запрос к авторизационному сервер, то есть нужно иметь правильно настроенные CORS-политики, а это само по себе не просто.</p><h2>Как защитить серверную сторону</h2><p>Вот чек-лист, когда речь идет об авторизации с помощью бекэнда:</p><ul><li>Не забывайте про state (nonce для OIDC).</li><li>PKCE давно перестал быть расширением и по факту используется всегда — не пренебрегайте им.</li><li>При проверке авторизации обязательно проверяйте не только корректность токена, но и его принадлежность к аккаунту. Если есть JWT — проверьте подпись, если нет — проверьте доступ к данным на стороне провайдера.</li><li>Обязательно валидируйте полученные JWT-токены, если есть JWKS — используйте его, если нет, то подумайте, стоит ли того потенциальный риск компрометации доступа.</li><li>Не используйте выданные внешним OAuth2-провайдером токены в качестве собственного механизма авторизации — для этого лучше подойдут классические Cookie или короткоживущие JWT-токены.</li><li>Продумайте: как ваша система должна реагировать на отзыв токена со стороны провайдера? Что делать в случае компрометации токена? Как это будет работать, если у вас stateless на JWT?</li><li>Ограничьте доступ инженеров к используемым секретам и сертификатам. Для этого есть готовые системы, например, <a href="https://www.vaultproject.io/">Vault</a> и прочие.</li><li>При работе через web максимально ужесточите политики передачи секретов — SameSite, HttpOnly и CORS ваши лучшие помощники.</li></ul><p>Если вы используете JWT, то обязательно:</p><ul><li>Подписывайте контент токенов с использованием асимметричных ключей. Например, RSA256 и тому подобными алгоритмами.</li><li>Проверяйте время жизни JWT.</li><li>Не сохраняйте в JWT, передаваемые клиентам, уязвимые данные, будь то авторизационные данные, какие-либо секреты из вашей системы или ПДн.</li></ul><p>Пример проверки JWT на сервере:</p><p><b>Если вам нужно управлять доступом и контролем сессий для пользователей, авторизованных через OAuth 2.0, не используйте JWT.</b></p><p>Несмотря на кажущуюся простоту и выигрыш за счет отсутствия подконтрольного вам хранилища, механизм JWT крайне уязвим и практически не имеет стандартных механизмов защиты: ни отозвать токен, ни прервать его доступ к какой-то из подсистем невозможно.</p><blockquote>Единственное, что предоставляет такие механизмы — персистентное хранилище на стороне вашего сервера, позволяющее так или иначе отслеживать доступы к конкретному аккаунту. Да, можно доработать JWT, чтобы они поддерживали необходимые механизмы, за счет использования таких хранилищ, но тогда вы переизобретаете классические сессии на основании Cookies.</blockquote><h2>О логировании и мониторинге</h2><p>Логирование событий и мониторинг активности — основа для обеспечения безопасности работы с протоколами OAuth 2.0 и OIDC. Важно не только фиксировать ключевые действия, но и уметь анализировать их, чтобы вовремя предотвращать угрозы. Чтобы все проходило гладко, нужно фиксировать эти события:</p><ul><li>Факт выдачи токенов (пара access и refresh).</li><li>Факт обновления токена через refresh-token.</li><li>Факт отзыва токенов (и инициатора этого действия).</li><li>Неуспешные запросы на обновление токенов — эти события могут сигнализировать о злоумышленной активности.</li></ul><p>Важно! Каждый токен должен быть связан с конкретным клиентом и пользователем для простоты последующего анализа.</p><h2>Как обнаруживать и предотвращать аномальную активность</h2><p>Хотя протоколы OAuth 2.0 и OIDC предоставляют базовые механизмы защиты, обнаружение аномалий выходит за рамки этих стандартов. Здесь в дело вступают дополнительные подходы.</p><h3>Ключевые механизмы безопасности в OAuth 2.0 и OIDC:</h3><p><b>client_id и client_secret:</b></p><ul><li>Идентифицируют и аутентифицируют клиентское приложение.</li><li>client_id : безопасно передавать в открытом виде.</li><li>client_secret : необходимо хранить в тайне, так как его утечка делает приложение скомпрометированным.</li></ul><p><b>redirect_url и scopes:</b></p><ul><li>redirect_url: предотвращает перенаправление пользователей на злоумышленные сайты.</li><li>scopes: гарантируют, что приложение не запросит больше прав, чем разрешил пользователь.</li></ul><h3>Что отслеживать для выявления угроз</h3><ul><li>Попытки использования неверных или устаревших токенов.</li><li>Частые запросы на обновление токенов от одного клиента (могут сигнализировать о злоумышленной активности).</li><li>Многочисленные запросы к ресурсам с разных IP-адресов в короткий промежуток времени.</li></ul><p>OAuth2 используется для интеграции множества клиентов с одним провайдером. Различение клиентов — это основа защиты данных.</p><h3>Распространенные ошибки и советы</h3><p>Большинство ошибок связаны с нарушением стандартов безопасности. Вот основные из них:</p><ul><li>Устаревшие или неверные настройки redirect_url.<br /></li><li>Хранение client_secret на стороне клиента.</li></ul><p><b>Чтобы этого не происходило, вот несколько советов:</b></p><ul><li>Используйте готовые фреймворки и библиотеки для реализации протоколов OAuth 2.0 и OIDC.</li><li>Регулярно пересматривайте и обновляйте client_secret.</li><li>Отслеживайте и своевременно отзывайте токены.</li></ul><h3>А что со сторонними поставщиками</h3><p>Популярные сервисы, такие как Auth0 и Google Identity, выполняют несколько задач:</p><ol><li>Обеспечивают отказоустойчивое и безопасное хранилище токенов.</li><li>Реализуют весь процесс авторизации и аутентификации.</li><li>Предоставляют готовые интеграции с популярными OAuth 2.0-провайдерами (например, GitHub).</li></ol><p>Использование сторонних решений снижает риск ошибок и упрощает разработку.</p><h2>Особенности интеграции с популярными API</h2><p>В зависимости от степени древности конкретного API, могут появляться неожиданные костыли, которые не описаны в стандарте.</p><p>Согласно <a href="https://datatracker.ietf.org/doc/html/rfc6749">RFC-6749</a>, провайдер может отдать вместе с access и refresh-токеном список предоставленных scope’ов.</p><p>Важный момент:  не все из того, что вы запрашивали, будет и правда выдано. Клиент может просто не согласиться дать вам доступ, например, к списку контактов, увы.</p><h2>Примеры:</h2><ol><li><b>Google: </b>Поддерживает устаревший метод https://www.googleapis.com/oauth2/v1/tokeninfo, который, хотя и удобен, не описан в стандарте.</li><li><b>Яндекс:</b> Предоставляет вечные access-токены, которые никогда не истекают. Возможно, коллеги в свое время не решились поддерживать большой фон запросов на перевыпуск токена, и в итоге вопрос безопасности пользователей ложится на потребителей OAuth2 API Yandex в большей мере, чем хотелось бы.</li></ol><p>Стандарт OAuth 2.0 допускает расширения (например, добавление новых grant_type), что позволяет адаптировать его к потребностям конкретных приложений.</p><p>OAuth 2.0 и OIDC — это основа современной аутентификации и авторизации. Чтобы использовать их эффективно, важно следовать рекомендациям: защищать токены, логировать ключевые события и внедрять проверенные механизмы безопасности. А тщательная настройка и внимание к деталям помогут избежать уязвимостей и защитить пользователей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Написанный ИИ код назвали «сбоящим» и «вызывающим проблемы». Но почему?</title>
      <link>https://tproger.ru/news/napisannyj-ii-kod-nazvali--sboyashhim--i--vyzyvayushhim-problemy---no-pochemu-</link>
      <comments>https://tproger.ru/news/napisannyj-ii-kod-nazvali--sboyashhim--i--vyzyvayushhim-problemy---no-pochemu-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/napisannyj-ii-kod-nazvali--sboyashhim--i--vyzyvayushhim-problemy---no-pochemu-</guid>
      <description><![CDATA[<p>Компании, использующие ИИ-инструменты для генерации кода, всё чаще сталкиваются с перебоями и проблемами безопасности. Исследования показывают, что автоматический код имеет высокий процент ошибок, а разработчики менее тщательно проверяют его</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/napisannyj-ii-kod-nazvali--sboyashhim--i--vyzyvayushhim-problemy---no-pochemu-">Написанный ИИ код назвали «сбоящим» и «вызывающим проблемы». Но почему?</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 19 Sep 2024 10:59:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компании, которые используют искусственный интеллект для генерации кода, сталкиваются с перебоями в работе и проблемами безопасности.</p><p>По данным Sonar — компании, предоставляющей продукты для оценки качества кода — даже крупные финансовые организации сообщают о сбоях, вызванных ошибками в автоматически сгенерированном коде.</p><p>Исследования показывают, что такие инструменты, как ChatGPT, GitHub Copilot и Amazon CodeWhisperer, генерируют корректный код лишь в 65.2%, 46.3% и 31.1% случаев соответственно.</p><p>Основная проблема кроется в неспособности ИИ адекватно работать с математической логикой и общих сложностях с пониманием алгоритмов.</p><h2>Недостаточная проверка как возможная причина</h2><p>По данным исследования Snyk, более половины компаний в конце 2023 года сталкивались с проблемами безопасности в коде, сгенерированном ИИ.</p><p>Ожидается, что к 2028 году около 90% корпоративных инженеров будут использовать ИИ для написания кода, что может усилить эту проблему.</p><p>По словам CEO Sonar Тарика Шауката, компании часто внедряют ИИ-инструменты для генерации кода без достаточной проверки и строгих практик рецензирования. Разработчики менее тщательно проверяют код, написанный искусственным интеллектом, так как не чувствуют за него полной ответственности.</p><h2>Эффект «laisser-faire»</h2><p>Исследование Стэнфордского университета в 2023 году показало, что программисты, использующие ИИ-инструменты, пишут менее безопасный код, но не считают его таковым.</p><p>Это создает иллюзию того, что все под контролем, и подталкивает разработчиков к более расслабленному подходу к проверке и тестированию кода.</p><h2>Проблема «code churn» и «копипаста»</h2><p>С ростом использования ИИ для написания кода наблюдается и увеличение количества правок. Исследователи GitClear обнаружили, что количество так называемого «code churn» — изменений кода, которые приходилось исправлять или отменять менее чем через две недели после написания — стремительно растет.</p><p>Прогнозируется, что в 2024 году число таких изменений удвоится по сравнению с 2021 годом. Кроме того, увеличилось количество скопированных и вставленных фрагментов кода, что нарушает принцип «DRY» («Don’t Repeat Yourself») и ведет к сложностям в поддержке проекта.</p><p>Стоит, правда, отметить, что несмотря на выявленные проблемы, компании не отказываются от использования ИИ-инструментов, так как они значительно ускоряют процесс разработки.</p><p>Тарик Шаукат отмечает, что около 30% предложений ИИ-программ принимаются разработчиками, что является существенным показателем.</p>]]></content:encoded>
    </item>
    <item>
      <title>Toshiba сделала квантовый рандомайзер для реального, а не лабораторного использования</title>
      <link>https://tproger.ru/news/toshiba-sdelala-kvantovyj-randomajzer-dlya-realnogo--a-ne-laboratornogo-ispolzovaniya</link>
      <comments>https://tproger.ru/news/toshiba-sdelala-kvantovyj-randomajzer-dlya-realnogo--a-ne-laboratornogo-ispolzovaniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/toshiba-sdelala-kvantovyj-randomajzer-dlya-realnogo--a-ne-laboratornogo-ispolzovaniya</guid>
      <description><![CDATA[<p>Исследователи Toshiba произвели фурор — они представили свой квантовый рандомайзер. Он предназначен не только для лабораторных тестов, но и для реального использования</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/toshiba-sdelala-kvantovyj-randomajzer-dlya-realnogo--a-ne-laboratornogo-ispolzovaniya">Toshiba сделала квантовый рандомайзер для реального, а не лабораторного использования</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Квантовые вычисления]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Jun 2024 15:18:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современные технологии все больше опираются на случайные числа для обеспечения безопасности и конфиденциальности.</p><p>Toshiba совершила настоящий прорыв в этой области, представив квантовый генератор случайных чисел (QRNG), готовый для массового использования вне лабораторий.</p><h2>Случайные числа: основа цифровой безопасности</h2><p>Случайные числа — это краеугольный камень цифровой безопасности. Традиционные псевдослучайные генераторы чисел (PRNG) основываются на алгоритмах, которые при определенных условиях могут быть предсказаны.</p><p>Это открывает возможность для атак и компрометации данных. Квантовые же генераторы, такие как QRNG, используют квантовые эффекты, которые по своей природе являются действительно случайными, обеспечивая высокую степень безопасности.</p><h2>Технологический прорыв Toshiba</h2><p>Исследователи Toshiba разработали QRNG на основе фотонной интегральной схемы (ФИС), что позволило значительно уменьшить размер и стоимость устройства.</p><p>В отличие от громоздких лазеров и детекторов, используемых в предыдущих версиях, новая технология компактна, но все еще эффективна.</p><h2>Как это работает</h2><p>В основе QRNG от Toshiba лежат два лазера, которые генерируют оптические импульсы со случайными фазами из-за квантовых шумов.</p><p>Эти импульсы взаимодействуют друг с другом, создавая сигнал с непредсказуемой оптической интенсивностью. Далее этот сигнал преобразуется в случайный электрический импульс с помощью высокоскоростного детектора.</p><p>Полученные данные обрабатываются и превращаются в случайные биты, которые могут передаваться со скоростью до 2 Гбит/с.</p><h2>Преимущества и тестирование</h2><p>Разработка Toshiba не только компактна, но и экономична в производстве, что делает ее доступной для массового использования.</p><p>Первоначальные тесты показали, что QRNG работает стабильно и надежно, даже при значительных изменениях температуры. Исследователи компании интегрировали свой генератор в систему квантового распределения ключей (QKD) и успешно испытали его в реальных условиях в течение 38 дней.</p>]]></content:encoded>
    </item>
    <item>
      <title>Конвейер безопасности</title>
      <link>https://tproger.ru/interactive/konvejer-bezopasnosti</link>
      <comments>https://tproger.ru/interactive/konvejer-bezopasnosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Соколова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/interactive/konvejer-bezopasnosti</guid>
      <description><![CDATA[<p>Проверьте свою способность находить уязвимости в игре МТС RED</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/interactive/konvejer-bezopasnosti">Конвейер безопасности</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Игры]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 22 Feb 2024 17:29:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>-</p>]]></content:encoded>
    </item>
    <item>
      <title>5 шагов к безопасной разработке</title>
      <link>https://tproger.ru/articles/5-shagov-k-bezopasnoj-razrabotke-erid-ljn8jv121</link>
      <comments>https://tproger.ru/articles/5-shagov-k-bezopasnoj-razrabotke-erid-ljn8jv121?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Соколова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-shagov-k-bezopasnoj-razrabotke-erid-ljn8jv121</guid>
      <description><![CDATA[<p>Рассказываем, какие базовые шаги нужно обязательно сделать, чтобы разрабатываемое ПО было безопасным.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-shagov-k-bezopasnoj-razrabotke-erid-ljn8jv121">5 шагов к безопасной разработке</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 09 Feb 2024 06:30:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработка безопасного программного обеспечения — это набор различных контролей и связанных с ними гейтов, которые встраиваются в процессы производства, чтобы выявить и устранить уязвимости в коде и в компонентах, используемых при разработке ПО или на этапе сборки. Давайте рассмотрим, какие базовые шаги нужно обязательно сделать, чтобы разрабатываемое ПО было безопасным. А поможет нам в этом руководитель Центра платформ кибербезопасности МТС RED Денис Шефановский.</p><h2>Проектирование</h2><p>Современные методологии разработки безопасного ПО включают в себя процесс анализа поверхности атак. Это требует специальных подходов к проектированию архитектуры, и без архитекторов информационной безопасности при проектировании продуктов не обойтись. В противном случае допускаются первичные ошибки, которые в дальнейшем сложнее всего исправить. В некоторых случаях может даже потребоваться полный рефакторинг продукта, а это весьма ресурсозатратный процесс.</p><p>Например, у нас в компании есть архитектор ИБ, который проектирует систему защиты. При этом он не только определяет, как правильно разместить информационную систему в окружении, но и формирует модель угроз и будущую архитектуру продукта с учетом минимизации поверхности атаки.</p><p>Одно дело разместить некий API для мобильного приложения в интернете, а другое – проверить его динамическим анализом (DAST) или фаззингом (FUZZ testing) и разместить за API-гейтвеем, который реализует необходимые контроли и минимизирует поверхность атаки.</p><p>Архитекторы ИБ также могут учитывать разнообразие вариантов применения «коробочных» продуктов и вводить дополнительные контроли или меры защиты.</p><h2>Разработка</h2><p>Компании используют разные стратегии проверки кода на наличие уязвимостей. Одни могут делать это непрерывно: допустим, разработчик выложил новый код в репозиторий, и система анализа безопасности кода тут же его автоматически проверила.</p><p>Другие сначала выпускают релиз-кандидат продукта и затем проводят максимально полное устранение уязвимостей в своем коде, сторонних компонентах, например, при сертификации продукта во ФСТЭК. Кроме этого, также могут выявлять и устранять недекларированные возможности, которые может использовать злоумышленник.</p><h2>Сборка</h2><p>Во-первых, при сборке ПО можно использовать только код, проверенный инженерами AppSec (Application Security).</p><p>Во-вторых, в большинстве продуктов применяется множество сторонних компонент, поэтому уже проверенные компоненты рекомендуется хранить в доверенных артефакториях. Из них на стадии сборки программного обеспечения разработчики смогут забирать уже протестированные на отсутствие уязвимостей части ПО. В противном случае разработчик может позаимствовать из интернета уязвимый код.</p><p>В-третьих, уже полученный исполняемый код должен подвергаться DAST- и фаззинг-анализу для того, чтобы выявить более широкий класс уязвимостей.</p><h2>Управление уязвимостями</h2><p>Для выявления уязвимостей в разрабатываемом программном обеспечении применимы несколько видов анализа и связанных с ними инструментов.</p><p>— SAST (статический анализ кода), <br />— SCA (компонентный анализ ПО),<br />— DAST (динамический анализ ПО),<br />— FUZZ testing (фаззинг-тестирование),<br />— MAST (тестирование безопасности мобильных приложений),<br />— IAST (интерактивное тестирование безопасности приложений),<br />— RASP (самозащита приложения во время выполнения).</p><p>Эти инструменты нужно интегрировать в pipeline разработки и управлять ими для проведения сканирований. Даже для одного вида анализа может одновременно применяться несколько разных инструментов, поэтому при большом количестве таких одновременных проверок необходима оркестрация (управление «оркестром» анализаторов).</p><p>Конечно, анализаторы могут выдавать немалый объем ложноположительных срабатываний или пропускать часть уязвимостей. Поэтому любые инструменты анализа необходимо, во-первых, настраивать, а во-вторых, обрабатывать результаты проверок. Делать это можно, используя методы дедупликации (устранения дублей кода), корреляции (соотнесения результатов разных типов анализа между собой). Эти методы сложны в реализации и не могут быть выполнены вручную человеком.</p><p>Чтобы решить эти проблемы, используются <a href="https://tprg.ru/YbhH">системы класса ASOC (Application Security Orchestration and Correlation)</a>. В них реализована автоматизация управления различными инструментами анализа ПО, которые нужны для обнаружения уязвимостей. Уязвимости, выявленные разными инструментами, собираются в едином представлении и приоритизируются по критичности – так AppSec специалист может быстрее и эффективнее их обработать. Кроме того, такие системы внутри себя содержат всю необходимую функциональность для построения процесса разработки безопасного кода ПО в компании.</p><h2>Управление рисками, связанными с уязвимостями</h2><p>Как и во многих процессах, в разработке безопасного программного обеспечения существует процесс управления рисками. Можно использовать все стандартные подходы в зависимости от ситуации: принятие риска, избегание, передача или его снижение. Это позволяет быть более гибкими с точки зрения скорости выпуска релизов, условий применения разрабатываемых продуктов и улучшает лояльность бизнеса к процессам AppSec.</p><p>Если не хочется быть «бабой ягой, которая всегда против», управление рисками должно стать частью применения практик безопасной разработки в компании. Конечно, существуют ситуации нетерпимости к рискам, например, разработка средств защиты информации, но это не должно применяться во всех случаях.</p><p>Давайте разберем некоторые примеры. Так, уязвимость может содержаться в неиспользуемой части кода. Она будет выявлена инструментами анализа, но такой риск можно принять.</p><p>Другой пример, когда уязвимость может содержаться в компоненте, который сложно заменить, или исправить уязвимость в его исходном коде невозможно. В этом случае могут использоваться меры предотвращения эксплуатации найденных уязвимостей: например, виртуальный патчинг на WAF (межсетевом экране для веб-приложений).</p><p>Есть и другие подходы: можно осуществлять мониторинг поведения программного обеспечения непосредственно во время его исполнения на продуктиве (RASP) и уже на основе поведенческой модели делать заключение об эксплуатации уязвимости.</p><h2>Подытожим</h2><p>Безопасность современного ПО напрямую влияет на бизнес и его клиентов, это влияние может быть очень ощутимым, например, в таких сферах, как банки, медицина, критическая информационная инфраструктура и т.п. В то же время программное обеспечение постоянно развивается, и скорость этих изменений важна для бизнеса. В таких условиях обеспечивать вручную безопасность ПО с миллионами строк кода и множествами команд разработки невозможно. <a href="https://tprg.ru/YbhH">Системы класса ASOC</a> предлагают необходимую для решения этой непростой задачи автоматизацию и дают бизнесу уверенность в безопасности используемого ПО.</p><p><i>Реклама ПАО «МТС» erid: LjN8Jv121</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Как внедрить систему безопасной разработки ПО</title>
      <link>https://tproger.ru/articles/kak-vnedrit-sistemu-bezopasnoj-razrabotki-po-opyt-korporativnogo-messendzhera-tada</link>
      <comments>https://tproger.ru/articles/kak-vnedrit-sistemu-bezopasnoj-razrabotki-po-opyt-korporativnogo-messendzhera-tada?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Artem Kazantsev]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-vnedrit-sistemu-bezopasnoj-razrabotki-po-opyt-korporativnogo-messendzhera-tada</guid>
      <description><![CDATA[<p>Как организовать систему безопасной разработки ПО в компании и с какими самыми частыми ошибками приходится сталкиваться.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-vnedrit-sistemu-bezopasnoj-razrabotki-po-opyt-korporativnogo-messendzhera-tada">Как внедрить систему безопасной разработки ПО</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 Jan 2024 10:33:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Меня зовут Артем Казанцев, я эксперт по информационной безопасности в Tada (Proscom). Работаю в сфере ИБ более 9 лет. С 2016 по 2019 год занимался консалтингом в части обеспечения защиты информации государственных информационных систем и информационных систем персональных данных. С 2019-го начал приводить в соответствие разработку программного обеспечения, реализующего функции защиты информации, требованиям по сертификации с последующей сертификацией.</p><p><i>Эта статья пригодится разработчикам, которые, как и мы когда-то, задумываются об ИБ в продуктах и не знают, с чего начать.</i></p><p>Поскольку нашим продуктом будут пользоваться многие компании, в том числе те, которые должны соответствовать требованиям в части обеспечения ИБ, хранить и обрабатывать конфиденциальную информацию, нам было важно минимизировать вероятность реализации угроз информационной безопасности.</p><h2>Как мы проверяли безопасность разработки в компании</h2><p>Логичен вопрос, зачем вообще внедрять систему разработки безопасного ПО в компании? Регуляторы требуют — это понятно. Но есть ли другие, более насущные предпосылки? Разумеется:</p><ul><li>это снизит риск внезапного появления критических уязвимостей;</li><li>повысит стабильность продукта и унификацию в языках, пакетах, внешних зависимостях;</li><li>улучшит качество кода, компетенций команды инженеров в части безопасной разработки;</li><li>компания сможет продавать продукт, не переживая за его безопасность.</li></ul><p>Я пришел в Tada в конце 2022 года. На тот момент о безопасной разработке ПО (БРПО) в ней «слышали, но не погружались». Поэтому для начала мне нужно было понять:</p><ol><li>Какие меры уже реализованы и насколько хорошо?</li><li>Действительно ли продукт безопасно разработан, и какие уязвимости, недочеты есть в ПО и в инфраструктуре разработки?</li></ol><p>Поскольку у меня уже был опыт прохождения сертификационных испытаний по требованиям ФСТЭК России к уровням доверия (одно из требований – наличие у разработчика-изготовителя процедур БРПО и проведение анализа уязвимостей и недекларированных возможностей), я понимал, какие процедуры, меры и инструментальные виды анализа должны быть реализованы.</p><p>Кроме того, можно и нужно воспользоваться документами, которые помогают облегчить внедрение процедур разработки безопасного ПО:</p><ul><li>ГОСТ 56939-2016;</li><li>Методика выявления уязвимостей и недекларированных возможностей в ПО ФСТЭК России (чтобы сертифицировать продукт).</li></ul><p>И иными источниками: данными с конференций, презентациями компаний, в которых они делятся опытом (ТБ Форум, Kaspersky Certification Day и др.)</p><p><i>Дисклеймер: мы не претендуем на звание гуру MegaNanoExpertDevSecOpsGeneral и цель статьи не пытаться научить, а поделиться нашим опытом, который, возможно, окажется полезен тем, кто находится в начале ИБ-пути.</i></p><p>Вернемся к проверке компании. На тот момент команда уже проводила unit-тесты и функциональное тестирование ПО, что было уже хорошо и позволяло выявить явные ошибки в ПО, которые могут привести к угрозам безопасности:</p><ul><li>недостаточная аутентификация и авторизация;</li><li>уязвимости ввода данных;</li><li>утечка конфиденциальных данных;</li><li>недостаточная обработка ошибок и другие.</li></ul><p>Что касается оценки безопасности продукта, мы решили провести:</p><ol><li>Статический анализ исходного кода.</li><li>Ручное тестирование (что-то типа функционального), чтобы выявить реальные баги в функциях ИБ ПО.</li><li>Анализ уязвимостей заимствованных компонентов и компонент среды функционирования ПО.</li><li>Динамический анализ и тестирование на проникновение.</li></ol><p>Для этого мы выбрали следующие инструменты:</p><figure><img src="https://media.tproger.ru/user-uploads/96702/2024-01-19/0904d5f5-8fc5-4e6b-bbae-32032e1617a6.png" alt="" /></figure><p>Результаты анализа оказались довольно интересными и местами даже неожиданными. Мы выявили около 200 critical и major (статический анализ) и 90 critical и high (анализ заимствованных компонент, динамический анализ и пентест).</p><figure><img src="https://media.tproger.ru/user-uploads/96702/2024-01-19/a3871fc5-b497-4f4b-a308-ee0b013e7386.png" alt="" /></figure><p>Уязвимостей было много, и вот несколько наиболее интересных примеров:</p><h3>1. Неправильная конфигурация turn-сервера</h3><figure><img src="https://media.tproger.ru/user-uploads/96702/2024-01-19/23ef9519-8c16-48db-8e07-35a4ba688e34.png" alt="" /></figure><p>Для обеспечения обмена трафиком (видео/голос) мы используем turn-сервер. В ходе анализа мы выявили реквизиты доступа в открытом виде в файле features.json.</p><p>Что могло случиться? Злоумышленник мог построить socks-прокси (из-за неправильной конфигурации turn-сервера). В нашем случае сервер не проверяет, что адрес, по которому нужно подключиться, находится в локальной сети. Таким образом злоумышленник смог бы получить доступ ко внутренним ресурсам.</p><h3>2. Хранимая XSS</h3><p>Хранимая XSS (англ. Stored XSS) – это тип атаки на веб-приложение, при котором злоумышленник вводит вредоносный код (обычно JavaScript) на страницу веб-приложения, который сохраняется на сервере и затем отображается на странице для всех пользователей, которые обращаются к этой странице.</p><p>Здесь все просто: Cookie защищены флагом httponly от перехвата с помощью XSS. Однако злоумышленник может воспользоваться этой уязвимостью для переадресации пользователей на фейковый домен, чтобы получить учетные данные.</p><p>Достаточно вставить следующий payload XSS в некоторые формы ввода ПО, сгенерировать ссылку – приглашение и отправить жертве: \"--&gt;&lt;img src=x onerror=alert("XSS")&gt;.</p><figure><img src="https://media.tproger.ru/user-uploads/96702/2024-01-19/6169c588-050f-4bdb-a216-b0dd079c416a.png" alt="" /></figure><p>При переходе по ссылке-приглашению устанавливается cookieinvitation_token. Затем ПО проверяет ее на наличие этого cookie. Если оно существует, то переадресовывает пользователя в асинхронном режиме независимо от того, где в веб-приложении находится пользователь. Это позволяет внедрять вредоносный скрипт в любом чате и месте веб-приложения с целью перехвата нажатий клавиш (кейлоггер).</p><figure><img src="https://media.tproger.ru/user-uploads/96702/2024-01-19/d2d39ae7-39f6-4b5c-9b0b-9fe61bc09e23.png" alt="" /></figure><p>Эти и другие уязвимости дали нам понять, что:</p><ul><li>необходимо внедрять БРПО на раннем этапе разработки;</li><li>важно регулярно анализировать и обновлять уже имеющееся ПО и контролировать заимствованные компоненты.</li></ul><p>Чтобы устранить эти уязвимости и обеспечить безопасность нашего ПО, необходимо было принять соответствующие меры: исправить код, обновить зависимые компоненты, изменить архитектуру ПО.</p><h2>Что мы сделали по итогам проверки</h2><p>Поиск и устранение недостатков и уязвимостей в ПО – это малая и далеко не самая приоритетная часть на раннем этапе внедрения разработки безопасного ПО.</p><p>Главная задача – заинтересовать команду и бизнес в необходимости такой разработки, чтобы все участники двигались в одном направлении и стремились сделать продукт безопаснее. И не появились те, кто пытается плыть против течения.</p><h2>Как это прошло у нас</h2><p>Отмечу, что руководство компании изначально было заинтересовано в сертификации продукта. А это возможно только в случае корректно внедренных мер БРПО. Нам оставалось только показать и доказать эту причинно-следственную связь.</p><p>Кроме того, команда действительно любит продукт, который разрабатывает, сама им пользуется и хочет сделать его лучше. В этом случае перед нами стояла задача показать, что безопасная разработка ПО будет только плюсом и поможет в создании хорошего сервиса.</p><p>Мы составили и презентовали руководству дорожную карту с шагами и этапами, которые необходимо выполнить, чтобы получить сертификат соответствия. Каждый шаг и этап – это перечень мероприятий по приведению инфраструктуры и процесса разработки ПО в безопасный.</p><p>Затем мы провели цикл лекций для всей команды:</p><ul><li>обсудили пользу безопасной разработки для нашего продукта;</li><li>рассказали об основных мерах, которые предстоит реализовать;</li><li>поговорили о проблемах, которые есть в нашем продукте и которые нужно решить.</li></ul><p>Вернемся к уязвимостям. Их было очень много. Мы с командой разработки провели экспертизу и «разметку» результатов анализа, определили степень критичности и возможности реализации угроз, связанных с этими недостатками ПО.</p><p>Так у нас появился приоритизированный список уязвимостей и задачи, связанные с устранением этих уязвимостей. Для устранения некоторых из них потребовалось переписать почти половину кодовой базы (это еще один из поводов внедрять безопасную разработку на раннем этапе) — очень много времени ушло на правки, переконфигурирование компонентов среды функционирования.</p><h2>Что будем делать дальше</h2><p>После проверок и подведения результатов мы активно занимаемся повышением квалификации команды инженеров в части безопасной разработки и проводим семинары по ИБ.</p><h3>Обучаемся и внедряем процедуры проведения фаззинг-тестирования</h3><p>Фаззинг-тестирование — вид тестирования, который позволяет выявить уязвимости в ПО путем подачи на вход большого количества входных данных (отслеживание утечки памяти, аварийных завершений и так далее).</p><h3>Изучаем порядок и способ определения поверхности атаки, включая использование Natch</h3><p>Natch — полезный инструмент для определения поверхности атаки от наших коллег ИСП РАН.</p><p>Поверхности атаки — это интерфейсы и их модули в ПО, при использовании которых могут быть реализованы угрозы безопасности.</p><h3>Разрабатываем метрики и сценарии реагирования на инциденты ИБ</h3><p>Гарантировать 100% защищенности нельзя, всегда нужно быть готовым оперативно и правильно реагировать на инциденты ИБ.</p><h3>Планируем полностью автоматизировать инструментальные виды анализа</h3><p>Состав используемых инструментов и видов анализа достаточно объемный и нет необходимости руками делать рутинную работу, которую можно автоматизировать и внедрить в процессы жизненного цикла ПО.</p><h3>Планируем сократить кодовую базу и базу зависимостей</h3><p>Унификация в языках программирования, исключение «мертвого кода», контроль используемых зависимостей нам в этом помогут.</p><h3>Стремимся реализовать меры, которые позволят сертифицировать наше ПО и пройти процедуру оценки соответствия безопасной разработки ПО.</h3><p>Скажем сразу, эта статья вводная. И основная ее идея — показать, насколько важно внедрять процедуры разработки безопасного ПО, особенно на раннем этапе разработки, когда это менее трудозатратно.</p><p>В следующих материалах мы расскажем о вопросах выбора и внедрения инструментальных средств и организационных мер, о проблемах, с которыми сталкивались и и вариантах их решения.</p>]]></content:encoded>
    </item>
    <item>
      <title>Зачем нужен MISRA C — стандарт с огромным количеством запретов</title>
      <link>https://tproger.ru/articles/zachem-nuzhen-misra-c-standart-s-ogromnym-kolichestvom-zapretov</link>
      <comments>https://tproger.ru/articles/zachem-nuzhen-misra-c-standart-s-ogromnym-kolichestvom-zapretov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zachem-nuzhen-misra-c-standart-s-ogromnym-kolichestvom-zapretov</guid>
      <description><![CDATA[<p>Рассказываем, что такое стандарт MISRA для кода на С и С++, почему в MISRA описана сотня запретов и как применять стандарт в разработке ПО.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zachem-nuzhen-misra-c-standart-s-ogromnym-kolichestvom-zapretov">Зачем нужен MISRA C — стандарт с огромным количеством запретов</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Системный анализ]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Aug 2023 11:35:48 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://ru.wikipedia.org/wiki/MISRA_C">MISRA C</a> – это набор промышленных рекомендаций и стандартов, разработанных ассоциацией MISRA (Motor Industry Software Reliability Association) для разработки программного обеспечения на языке Си.</p><p>Стандарт был создан для того, чтобы повысить безопасность и надёжность кода в том случае, когда от его качества зависит жизнь человека. К примеру, MISRA используют в автомобильной отрасли.</p><p>К примеру, представьте, что ваш автомобиль из-за программной ошибки не позвонил в службу спасения. Или самолёт вдруг отказался опустить шасси. Или рентген взял и облучил вас высокой долей радиации. Или робот-хирург отказался работать посреди операции.</p><p>Конечно, эти примеры — донельзя утрированные, но столкнуться с ними в реальной жизни не хотелось бы никому. Именно жёсткий стандарт MISRA позволяет исключить возможность ошибки, которая может стоить жизни.</p><p>MISRA C определяет правила, которым разработчикам следует следовать при написании кода. Каждый год количество правил, по своей сути — запретов, только растёт:</p><ul><li>В MISRA-C:1998 указаны 127 правил: 93 обязательных и 34 рекомендательных.</li><li>В MISRA-C:2004 указано 141 правило: 121 обязательное и 20 рекомендательных.</li><li>В MISRA-C:2012 указаны 143 правила и 16 директив.</li></ul><p>Они включают рекомендации по оформлению, по использованию конструкций языка, предупреждают о потенциальных проблемах вроде неопределенного поведения или возможности ошибок.</p><h2>Как появился MISRA</h2><p>Стандарт MISRA был разработан ассоциацией MISRA (Motor Industry Software Reliability Association) в 1994 году в Великобритании. Изначальная цель стандарта — повысить безопасность и надежность ПО для автомобилей.</p><p>В начале 1990-х годов количество электроники в автомобилях неуклонно росло. Стало очевидно, что некачественный код может быть опасен для пассажира: к примеру, ошибка ПО во время движения может стоить водителю жизни. Чтобы обезопасить пассажиров, и была создана ассоциация MISRA.</p><p>Первый выпущенный стандарт назывался “MISRA Guidelines for the Use of C in Vehicle-Based Software”. Его опубликовали в 1994 году. Он определил правила для использования языка Cи в автомобильном ПО.</p><p>Помимо общих правил вроде оформления кода, первый стандарт включал в себя:</p><ol><li>Правила для управления типами данных, которые запрещали преобразование типов.</li><li>Рекомендации для обработки исключительных ситуаций (exceptions). Рекомендации по использованию операторов try-catch, исключений и т.д.</li><li>Запрет непортативных (non-portable) функций и конструкций, которые могут привести к неправильному поведению или ошибкам при переносе кода на другие платформы или компиляторы.</li><li>Рекомендации и требования к валидации кода и процессу разработки.</li></ol><p>В последующие годы стандарт обновлялся и дополнялся. В 2004 году был выпущен стандарт “MISRA C:2004”, а в 2012 году – стандарт “MISRA C:2012”.</p><p>В 2023 году стандарт снова обновился</p><h2>Где используется MISRA</h2><p>Сегодня стандарт используют почти во всём транспорте — в автомобильной и авиационной отраслях —, в медицине и промышленности. Вот несколько компаний, которые применяют MISRA в разработке ПО:</p><ol><li>Автомобильная промышленность: BMW, Ford, General Motors, Honda, Toyota и Volkswagen.</li><li>Авиационная промышленность: Airbus и Boeing.</li><li>Медицинская техника: Siemens Healthineers, Philips Healthcare и Medtronic.</li><li>Промышленные системы: Schneider Electric и Rockwell Automation.</li></ol><h2>Что запрещено в MISRA</h2><p>Вот несколько примеров того, что запрещено в стандарте MISRA:</p><ol><li>Фрагменты кода не должны быть закомментированы.</li><li>Базовые типы char, int, short, long, float и double не должны использоваться.</li><li>Операнды логических операторов &amp;&amp; или || должны быть первичными выражениями.</li><li>Оператор goto не должен использоваться.</li><li>Заголовочный файл  и функция setlocale не должны использоваться.</li></ol><p>К примеру, вместо char, int, short, long, float и double нужно использовать директиву typedef.</p><p>Неправильный код:</p><p>Правильный код:</p><p>Операнды &amp;&amp; и || должны быть одиночными переменными, константами или выражениями в скобках.</p><p>Неправильный код:</p><p>Правильный код:</p><p>С полным списком правил на русском языке <a href="https://easyelectronics.ru/files/Book/misra_c_rus.pdf">можно ознакомиться по этой ссылке</a>.</p><h2>Как проверять код на соответствие MISRA</h2><p>На рынке есть несколько анализаторов кода, которые проверяют соответствие стандарту MISRA.</p><ol><li><a href="https://pclintplus.com/">PC-lint/FlexeLint</a> — один из самых популярных инструментов статического анализа для языка C и C++. PC-lint/FlexeLint поддерживает проверку соответствия нескольким версиям стандарта MISRA C, включая MISRA C:1999, MISRA C:2004 и MISRA C:2012.</li><li><a href="https://www.mathworks.com/products/polyspace.html">Polyspace</a> — анализатор от MathWorks также поддерживает проверку соответствия стандарту MISRA C. Он помогает отслеживать проблемы вроде неопределенного поведения или использования небезопасных функций.</li><li><a href="https://www.perforce.com/products/klocwork">Klocwork</a> — ещё один популярный инструмент статического анализа, который поддерживает проверку соответствия стандарту MISRA C.</li><li><a href="https://cppcheck.sourceforge.io/">Cppcheck</a> — бесплатный и открытый инструмент статического анализа для C и C++. Изначально он не настроен на проверку соответствия стандарту MISRA, но Cppcheck помогает обнаружить некоторые нарушения.</li></ol><p>Также есть пара компиляторов.</p><ol><li><a href="https://www.iar.com/products/architectures/arm/iar-embedded-workbench-for-arm/">IAR Embedded Workbench</a> — один из наиболее известных компиляторов, который предоставляет мощный статический анализатор для поиска нарушения правил MISRA и предлагает решения для их исправления.</li><li><a href="https://www.ghs.com/products/MULTI_IDE.html">MULTI IDE</a> — интегрированная среда разработки (IDE) с компилятором, поддерживающим стандарт MISRA C. MULTI IDE включает в себя инструменты статического анализа, покрывающие правила MISRA и помогающие в обнаружении потенциальных ошибок.</li></ol><h2>Заключение</h2><p>В заключение, стандарт MISRA C — важный инструмент для повышения качества и безопасности кода, который включает рекомендации и правила для написания надежного и поддерживаемого ПО.</p><p>Но стоит отметить, что соблюдение стандарта не всегда обязательно и зависит от требований проекта. Некоторые компании выбирают свой набор правил, адаптированных под их цели и реалии разработки.</p><p>Соблюдение стандарта MISRA C — это только один из инструментов при разработке безопасного ПО. Он должен быть использован вместе с другими методологиями и практиками вроде тестирования или обзора кода.</p><p>Надеюсь, статья оказалась интересной и полезной. Если вы работаете, к примеру, в разработке ПО для автомобилей, расскажите в комментариях, используете ли вы MISRA в работе. Может быть, есть и другие стандарты, которые на практике популярнее MISRA?</p>]]></content:encoded>
    </item>
    <item>
      <title>Статический анализ в разработке встраиваемых систем</title>
      <link>https://tproger.ru/articles/staticheskij-analiz-v-razrabotke-vstraivaemyh-sistem</link>
      <comments>https://tproger.ru/articles/staticheskij-analiz-v-razrabotke-vstraivaemyh-sistem?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Yuliya Khushnamova]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/staticheskij-analiz-v-razrabotke-vstraivaemyh-sistem</guid>
      <description><![CDATA[<p>Статический анализатор проверяет код и помогает находить проблемы во встраиваемых системах. Ключевые аспекты: его возможные функции и практическая польза.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/staticheskij-analiz-v-razrabotke-vstraivaemyh-sistem">Статический анализ в разработке встраиваемых систем</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Ошибки в ПО]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Dec 2021 09:57:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Быстрый рост количества встраиваемых систем актуализирует вопрос качества их программного кода. А с учётом специфики разработки (затруднительная отладка, высокая цена ошибки и так далее), просто необходимо использовать специальные инструменты, позволяющие повысить их качество.</p><p>Одним из таких инструментов является статический анализатор кода. О статическом анализе и его пользе для встраиваемых систем и пойдёт речь в этой статье.</p><h2>Статический анализ кода</h2><p>В первую очередь разберёмся, что такое статические анализаторы кода и какие функции они могут потенциально выполнять.</p><p>Статический анализатор кода — это ПО, которое проводит анализ программы без её реального выполнения. Инструменты статического анализа проводят более глубокую проверку исходного кода, чем это делает компилятор, который обычно находит только синтаксические ошибки. Их принцип работы заключается в следующем:</p><ul><li>на вход принимают исходный код проекта (желательно компилируемый);</li><li>преобразуют исходный код в специальную модель для дальнейшего анализа (AST, семантическая информация и так далее);</li><li>ищут дефектные места, применяя к модели набор диагностических правил, в основе которых лежат различные <a href="https://pvs-studio.com/ru/blog/posts/cpp/0592/">методологии</a>;</li><li>сохраняют все полученные предупреждения в удобный для вас формат;</li><li>остаётся только изучить отчёт и исправить все дефектные места;</li><li>PROFIT!</li></ul><p>Статические анализаторы применяются для широкого спектра задач. Можно выделить наиболее распространённые:</p><p>Поиск ошибок в программном коде (наиболее распространённое применение). В этом плане статический анализ здорово дополняет процесс обзора кода, позволяя найти и исправить ряд проблем до того, как засядете на долгое время с коллегой.</p><p>Улучшение качества кода в широком смысле этого слова. К качеству можно отнести читаемость, поддерживаемость, сложность кода, уровень связанности и другие аспекты, которые прямо или косвенно могут влиять на количество ошибок. Тем самым, статические анализаторы могут помогать следовать стандартам кодирования (как принятым внутри компании, так и общепринятым).</p><p>Анализ кода как часть механизма Quality Gates в CI/CD. Анализаторы могут не только сообщать о наличии возможных ошибок в коде, но и служить защитным механизмом, предотвращающим доставку кода, если уровень его качества не соответствует заданным требованиям. Такую роль могут выполнять анализаторы кода, расширяющие поведение компилятора и блокирующие сборку, если были обнаружены ошибки или несоответствия кода принятым стандартам;</p><p>Сбор метрик проекта, сбор статистики, построение графиков и диаграмм, отражающих общее «состояние здоровья» проекта.</p><h2>Польза внедрения</h2><p>Польза от внедрения статического анализатора в разработку встроенного ПО несомненна. Давайте рассмотрим самые очевидные положительные стороны использования статического анализа.</p><h3>Использование статического анализа позволит уменьшить вероятность дорогой, а то и вовсе невозможной «перепрошивки» уже выпущенных устройств</h3><p>Ошибки в ПО встраиваемых систем крайне неприятны. Неприятность в том, что ошибки невозможно или почти невозможно исправить, если началось серийное производство. Если уже выпущены сотни тысяч стиральных машин и они разъехались по магазинам, то что делать при обнаружении неадекватной работы машины в определённом режиме? В общем-то вопрос риторический и реальных вариантов два:</p><ol><li>Смириться и получать негативные отзывы клиентов на различных сайтах, портя свою репутацию. Можно, конечно, выпустить и разослать к инструкции приложение «не делайте вот так», но это тоже слабый вариант;</li><li>Отозвать серию и заняться обновлением прошивок. Дорогое развлечение.</li></ol><p>Далее, независимо от того, велик тираж устройств или мал, правка ошибок может быть проблемной или запоздалой. Ракета <a href="https://pvs-studio.com/ru/blog/posts/cpp/0426/">упала</a> — ошибка обнаружена, но поздно. Пациенты <a href="https://pvs-studio.com/ru/blog/posts/0438/">умерли</a> — ошибка обнаружена, но людей это не вернёт. Противоракетный комплекс начинает <a href="https://pvs-studio.com/ru/blog/posts/0445/">промахиваться</a> — ошибка обнаружена, но ничего приятного в этой истории нет. Машины <a href="https://pvs-studio.com/ru/blog/posts/0439/">не тормозили</a>, ошибки найдены, но пострадавшим с этого прока нет. Цена ошибки ужасает, не правда ли?</p><p>Вывод очень простой: код встраиваемых устройств должен тестироваться как можно тщательнее, особенно, если ошибки могут привести к жертвам или серьёзным материальны потерям.</p><p>Статический анализ не гарантирует отсутствие ошибок в коде. Однако просто необходимо использовать любую возможность дополнительно проверить корректность кода. Статические анализаторы могут указать на множество разнообразных ошибок, которые умудряются оставаться даже после нескольких Code-Review.</p><p>Если в устройстве благодаря статическому анализу будет на несколько ошибок меньше, это великолепно. Возможно, благодаря обнаружению именно вот этих ошибок никто не погибнет или компания не потеряет большие деньги и репутацию из-за претензий со стороны клиентов.</p><h3>Статические анализаторы кода значительно удешевляют процесс тестирования и отладки программ</h3><p>Использование статического анализа позволяет находить ошибки ещё на этапе кодирования или, по крайней мере, во время ночных запусков на сервере. Вследствие чего поиск и исправление большинства ошибок будут обходиться гораздо дешевле.</p><p>Наверняка у каждого разработчика была неудачная попытка «прошить» устройство, в результате чего, например, оно некорректно держало заданное напряжение или вовсе перегорало. Что произошло и где искать проблему? Ведь причиной этому может быть не только программная ошибка, но и ошибка в самом «железе» или в некачественном изготовлении макета. В результате процесс поиска ошибки может сильно затянуться. Самый обидный сценарий:</p><ul><li>разработчик с полной уверенностью считает, что код написан верно;</li><li>привлекаются схемотехники и другие коллеги, отвечающие за hardware-часть;</li><li>идут долгие и мучительные поиски проблемы;</li><li>разработчик возвращается к коду и внезапно обнаруживает, наконец, нелепую опечатку;</li><li>колоссально неэффективный расход сил и времени коллектива;</li><li>стыдно и неприятно.</li></ul><p>Такая ошибка вполне могла появиться из-за того, что разработчик использовал в текущем проекте свои старые наработки, которые нужно было по минимуму адаптировать под текущий проект. Например, мог получиться такой ошибочный фрагмент кода:</p><p>А предыстория этой ошибки такая. За основу были взяты наработки от предыдущего проекта, и код во многом написан методом Copy-Paste. По невнимательности разработчик в одном месте забыл заменить 4 на 3. Как итог, неопределённое поведение при обращении к индексу за пределами массива. Коварность такого кода в том, что при отладке программа может работать корректно, а в реальных условиях при многократном запуске у клиента может происходить сбой. Великолепно, если такую ошибку найдёт статический анализатор.</p><p>Поэтому, чтобы избежать мучительного и нервного отлаживания программы, важно обнаружить как можно больше дефектных мест перед «прошивкой» устройства.</p><h3>Использование статического анализа позволит подстраховать разработчика с недостаточной экспертизой</h3><p>Ошибки в программах образно можно разделить на два типа. Про ошибки первого типа программист знает, и появляются они в коде случайно, по невнимательности. Ошибки второго рода возникают в ситуации, когда программист просто не знает о том, что так писать код нельзя. Другими словами, он может сколько угодно читать такой код, но всё равно не найдёт ошибку.</p><p>Статические анализаторы имеют базу знаний о различных паттернах, которые в определённых условиях приводят к ошибке. Поэтому они могут указать программисту на ошибку, о существовании которой он сам вряд ли бы догадался. Примером может служить использование 32-битного типа <i>time</i><i>_t</i>, который может привести к неправильной работе устройства после <a href="https://pvs-studio.com/ru/blog/posts/cpp/0505/">2038 года</a>.</p><p>Другим примером может служить неопределённое поведение программы, которое возникает из-за <a href="https://pvs-studio.com/ru/blog/posts/cpp/0142/">неправильного использования</a> операторов сдвига &lt;&lt;/&gt;&gt;. Эти операторы очень широко используются в коде микроконтроллеров. К сожалению, программисты <a href="https://pvs-studio.com/ru/blog/examples/v610/">часто</a> используют эти операторы крайне неаккуратно, делая программы ненадёжными и зависимыми от версии и настроек компилятора. При этом программа может работать, но вовсе не потому, что написана правильно, а потому, что везёт.</p><p>Используя статический анализатор, программисты могут подстраховать себя от множества подобных неприятных ситуаций. Дополнительно анализатор может применяться для контроля качества кода в целом, что актуально, когда состав участников проекта растёт или меняется. Другими словами, анализатор помогает отследить, не начал ли новичок писать плохой код.</p><h3>Современные статические анализаторы предоставляют поддержку стандартов кодирования для встраиваемых систем, которые позволяют повысить уровень безопасности, переносимость и надёжность программ</h3><p>Для встраиваемых систем популярными языками программирования считаются C и С++. Именно для них были разработаны такие стандарты, как MISRA C, MISRA C++ и AUTOSAR C++. Каждый стандарт имеет немалое количество правил и рекомендаций (MISRA C: 143, MISRA C++: 228, AUTOSAR C++: более 350), придерживаться которых при кодировании просто невозможно без статических анализаторов кода.</p><p>Правила представляют собой паттерны кодирования, которые необходимо избегать, тем самым уменьшая вероятность допустить ошибку. Сейчас все крупные игроки статического анализа (<a href="https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html">Coverity</a>, Klockwork, <a href="https://pvs-studio.com/">PVS-Studio</a> и так далее) стремятся к тому, чтобы максимально покрыть эти стандарты в своих инструментах.</p><h2>Стандарты кодирования</h2><p>История MISRA началась достаточно давно. В начале 90-x правительственная программа Великобритании под показательным названием «Safe IT» выделяла финансирование для различных проектов, так или иначе связанных с безопасностью электронных систем. Сам проект MISRA (Motor Industry Software Reliability Association) был основан ради создания руководства по разработке ПО для микроконтроллеров в наземных транспортных средствах – в машинах, в общем.</p><p>MISRA (как организация) – это содружество заинтересованных сторон из различных авто- и авиастроительных индустрий:</p><ul><li>Bentley Motor Cars;</li><li>Ford Motor Company;</li><li>Jaguar Land Rover;</li><li>Delphi Diesel Systems;</li><li>HORIBA MIRA;</li><li>Protean Electric;</li><li>Visteon Engineering Services;</li><li>The University of Leeds;</li><li>Ricardo UK;</li><li>ZF TRW.</li></ul><p>Весьма сильные игроки рынка. Неудивительно, что их первый связанный с языком стандарт — MISRA C — стал общепринятым среди разработчиков критически важных встраиваемых систем. Чуть позже появился и MISRA C++. Постепенно версии стандартов обновлялись и дорабатывались, чтобы охватывать новые возможности языков. На данный момент актуальными версиями являются MISRA C: 2012 и MISRA C++: 2008.</p><p>Отличительные черты MISRA: невероятное внимание к деталям и крайняя дотошность. Авторы не просто собрали в одном месте все пришедшие в голову «дыры» C и C++ (как, например, авторы CERT) — они тщательно проработали международные стандарты этих языков и выписали все возможные способы ошибиться. А потом взяли и сверху дописали правила и рекомендации про читаемость кода. Ведь в простом и легко читаемом коде тяжелее допустить ошибку и легче её обнаружить при Code-Review.</p><p>Зачастую у людей, которые впервые сталкиваются с MISRA, складывается мнение, что философия стандарта заключается в «запретить вон то и запретить вот это». На самом деле, это так, но лишь отчасти.</p><p>Да, стандарт действительно имеет много подобных правил, но его цель — не запретить всё возможное, а перечислить все-все-все способы как-то нарушить безопасность кода. Для большинства правил вы сами выбираете, стоит им следовать или нет. Объясню это подробнее.</p><p>В MISRA C правила делятся на три основных категории: Mandatory, Required и Advisory. Mandatory — это правила, которые нельзя нарушать ни под каким предлогом. Например, в этот раздел входит правило «не используйте значение неинициализированной переменной». Required-правила менее строги: они допускают возможность отклонения, но только если эти отклонения тщательно документируются и письменно обосновываются. Остальные правила входят в категорию Advisory — это правила, которым следовать необязательно.</p><p>В MISRA C++ немного по-другому: там отсутствует категория Mandatory, и большинство прави принадлежит к категории Required. Поэтому, по сути, вы имеете право нарушить любое правило — только не забывайте документировать отклонения. Также там есть категория Document — это обязательные к выполнению правила (отклонения не допускаются), которые связаны с общими практиками вроде «Каждое использование ассемблера должно быть задокументировано» или «Подключаемая библиотека должна соответствовать MISRA C++».</p><p>Помимо описания проблематики, в стандарте содержится большое количество советов о том, что нужно знать перед началом работы: как наладить процесс разработки по MISRA; об использовании статических анализаторов для проверки кода на соответствие; какие документы нужно вести, как их заполнять и так далее.</p><p>На данный момент MISRA живёт и развивается. Например, в начале 2019 года был анонсирован The MISRA C:2012 Third Edition (First Revision) — обновлённый и дополненный новыми правилами стандарт 2012 года. Тогда же объявили о грядущем выходе MISRA C:2012 Amendment 2 — C11 Core — стандарта 2012 года, в который будут добавлены правила, впервые охватывающие версии языка Си 2011 и 2018 годов.</p><p>Не стоит на месте и MISRA C++. Как известно, последний стандарт MISRA C++ датируется 2008 годом, поэтому наиболее старшая версия языка, которую он охватывает — это C++03. Из-за этого появился ещё один стандарт, аналогичный MISRA, и называется он AUTOSAR C++. Он изначально задумывался как продолжение MISRA С++ и имел своей целью охватить более поздние версии языка. В отличие от своего вдохновителя, AUTOSAR C++ обновляется два раза в год и на данный момент поддерживает C++14. Планируется дальнейшее обновление до C++17, а затем C++20 и так далее.</p><h2>Заключение</h2><p>В данной статье хотелось показать, что использование статического анализатора однозначно целесообразно для любого встраиваемого проекта. Используя эту методологию, вы сможете:</p><ul><li>сократить время на поиск и устранение ошибок;</li><li>уменьшить вероятность критических ошибок;</li><li>уменьшить вероятность необходимости обновления прошивок;</li><li>контролировать общее качество кода;</li><li>контролировать качество работы новых членов команды;</li><li>строго следовать определённому стандарту разработки программного обеспечения;</li><li>контролировать качество кода сторонних модулей/библиотек.</li></ul><p>Нужен ли вам статический анализ или нет, решать именно вам!</p>]]></content:encoded>
    </item>
    <item>
      <title>ИИ-помощник для программистов от Microsoft позволяет обойти лицензию GPL и выдаёт чужие ключи API</title>
      <link>https://tproger.ru/news/ii-pomoshhnik-dlja-programmistov-ot-microsoft-pozvoljaet-obojti-licenziju-gpl-i-vydajot-chuzhie-kljuchi-api</link>
      <comments>https://tproger.ru/news/ii-pomoshhnik-dlja-programmistov-ot-microsoft-pozvoljaet-obojti-licenziju-gpl-i-vydajot-chuzhie-kljuchi-api?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Борисов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ii-pomoshhnik-dlja-programmistov-ot-microsoft-pozvoljaet-obojti-licenziju-gpl-i-vydajot-chuzhie-kljuchi-api</guid>
      <description><![CDATA[<p>Эксперт в области ИИ Алекса Шампандард обратил внимание, что Copilot тащит в проект действительные API-ключи из открытых репозиториев.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ii-pomoshhnik-dlja-programmistov-ot-microsoft-pozvoljaet-obojti-licenziju-gpl-i-vydajot-chuzhie-kljuchi-api">ИИ-помощник для программистов от Microsoft позволяет обойти лицензию GPL и выдаёт чужие ключи API</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 Jul 2021 08:32:54 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы уже рассказывали о GitHub Copilot, который помогает программистам писать код. Как оказалось, этот софт позволяет обойти лицензию  General Public License (GPL), поскольку цитирует большие куски проектов с открытым кодом.</p><p>Copilot не копирует код, а создаёт «производный продукт» — это значит, что проекты, написанные с помощью ИИ от Microsoft, можно распространять под лицензиеями Copyleft или AGPL. То есть изначальная лицензия GPL «вымывается» из ПО.</p><p>Есть «фича» и пострашнее. Эксперт в области ИИ Алекса Шампандард обратил внимание, что Copilot тащит в проект действительные API-ключи из открытых репозиториев.</p><p>Дело в том, что иногда пользователи пренебрегают безопасностью и оставляют секретную информацию в публичных репозиториях. А GitHub Copilot учился именно на них, поэтому конфиденциальная информация может случайно попасть в чужой код в качестве подсказки от ИИ.</p><p>В «проблемах с безопасностью» обвиняют GitHub Copilot: Microsoft скармливали репозитории без согласия их создателей. Но в этой истории есть и вина пользователей, которые оставляют секретную информацию в открытом доступе.</p><p>Так что в следующий раз несколько раз подумайте, прежде чем сохранять проект в публичном репозитории. Иначе могут случиться такие казусы.</p><p>Источник: <a href="https://www.securitylab.ru/news/521960.php">SecurityLab</a></p>]]></content:encoded>
    </item>
    <item>
      <title>На каких языках написаны самые небезопасные проекты? Исследование от Veracode</title>
      <link>https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap</link>
      <comments>https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Почекутов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap</guid>
      <description><![CDATA[<p>Veracode изучила более 130 тысяч приложений: проблемы с безопасностью нашлись у 76% из них, а самым проблемным оказался код на PHP.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap">На каких языках написаны самые небезопасные проекты? Исследование от Veracode</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 21 Dec 2020 04:37:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Veracode, специализирующаяся на разработке инструментов для проведения аудита безопасности, <a href="https://www.veracode.com/state-of-software-security-report">опубликовала результаты</a> сравнения языков программирования. Оценивалась безопасность написанного на них кода.</p><p>В ходе исследования специалисты изучили более 130 тысяч приложений. Проблемы с безопасностью были выявлены у 76 % приложений. В каждом четвёртом случае найденные проблемы отнесены к категории опасных. В каждом третьем приложении уязвимости появились из-за использования сторонних библиотек.</p><p>Процент приложений с опасными проблемами безопасности:</p><ol><li>С++ — 59 %</li><li>PHP — 52,6 %</li><li>.NET — 25 %</li><li>Java — 23,8 %</li><li>Python — 9,6 %</li><li>JavaScript — 8,6 %</li></ol><p>Если говорить обо всех уязвимостях, то самым проблемным оказался код на PHP. В 74,6 % приложений встречается межсайтовый скриптинг, в 71,6 % случаев обнаружены проблемы с шифрованием.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/0_1608476837.png" alt="" /><figcaption>Результаты исследования</figcaption></figure><p>Результаты исследования с описаниями результатов <a href="https://info.veracode.com/state-of-software-security-volume-11-flaw-frequency-by-language-infosheet-resource.html">опубликованы</a> на странице State of Software Security. Там раскрыты наиболее распространённые уязвимости для каждого языка.</p><p>Есть также <a href="https://www.veracode.com/sites/default/files/pdf/resources/ipapers/security-flaw-heatmap/index.html">страница с подробным описанием</a> обнаруженных проблем и способов их исправления.</p>]]></content:encoded>
    </item>
    <item>
      <title>11 ошибок новичка, которые могут привести к дырам в кибербезопасности</title>
      <link>https://tproger.ru/articles/11-novice-mistakes-that-can-lead-to-security-problems</link>
      <comments>https://tproger.ru/articles/11-novice-mistakes-that-can-lead-to-security-problems?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/11-novice-mistakes-that-can-lead-to-security-problems</guid>
      <description><![CDATA[<p>Специалист BI.ZONE Андрей Колесников разобрал 11 распространённых ошибок, которые могут сделать приложение уязвимым, и предложил способы их избежать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/11-novice-mistakes-that-can-lead-to-security-problems">11 ошибок новичка, которые могут привести к дырам в кибербезопасности</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Nov 2020 10:30:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики стоят у основания любого ПО, и уже на самых ранних этапах им приходится думать не только о производительности и эффективности продукта, но и о его безопасности.</p><p>Однако мало кто из программистов в рамках своей специальности изучает методы написания безопасного кода или аспекты криптографии. Постоянно держать в голове техники кибербезопасности и возможные уязвимости — сложная задача, особенно для начинающего специалиста.</p><p>Ведущий специалист по тестированию компании <a href="https://bi.zone/">BI.ZONE</a> Андрей Колесников разобрал 11 распространенных ошибок, которые могут сделать ваше приложение уязвимым. По большей части эти ошибки влекут за собой кражу денег или данных, удаленное выполнение кода, отказ в обслуживании или повышение привилегий.</p><p>В статье рассмотрено, как тот или иной недочет приводит к дырам в безопасности, а также предложены варианты решения.</p><h2>1. Отсутствие экранирования, неправильное форматирование, а также некорректное использование форматной строки и параметров у printf-функции</h2><p>Проблема. Данные, попадающие в приложение из внешнего источника, недостаточно валидируются и фильтруются, в результате чего нарушается логика работы приложения.</p><p>Угроза. Такие ошибки связаны с целым <a href="https://owasp.org/www-project-top-ten/2017/A1_2017-Injection">рядом уязвимостей</a> и атак: SQL Injection, NoSQL Injection, XXE, XSS, уязвимость форматной строки и прочими. Последствием наличия таких недостатков может стать возможность компрометации системы организации.</p><p>Решение. Фильтруйте и валидируйте все данные, поступающие из внешних недоверенных источников, а также используйте встроенные средства языков программирования, спроектированные специально для устранения таких проблем (например, Prepared Statements в случае с SQL).</p><h2>2. Некорректная работа с конфиденциальными данными</h2><p>Проблема. Чувствительные данные, например, номера банковских карт, пароли или персональная информация, выводятся в журналы или передаются третьей стороне в открытом виде.</p><p>Угроза. Из-за недостаточно бережного отношения к конфиденциальным данным они могут стать доступны третьей стороне.</p><p>Решение. Отслеживайте цепочку работы с конфиденциальными данными: как они хранятся, обрабатываются, передаются и на каком из этих этапов может что-то пойти не так. В случае журналирования или передачи третьей стороне — применяйте маскирование: +7 (999) 888-77-66 -&gt; +7 (999)***-**-66 и т.п.</p><h2>3. Десериализация ненадежных данных</h2><p>Проблема. Приложение десериализует данные из недоверенного источника без достаточной их валидации. Такая уязвимость имеет идентификатор <a href="https://cwe.mitre.org/data/definitions/502.html">CWE-502</a> и находится на восьмом месте в рейтинге критических рисков веб-приложений <a href="https://owasp.org/www-project-top-ten/">OWASP Top Ten</a>.</p><p>Угроза. В результате <a href="https://cyberpolygon.com/ru/materials/insecure-deserialisation/">атаки на механизмы десериализации</a> злоумышленник нередко получает возможность удаленно исполнять команды в скомпрометированной системе.</p><p>Решение. По возможности используйте простые форматы (например, JSON) для передачи данных и для их сохранения на диск или в базу данных. Кроме того, ведите белый список допустимых классов и подписывайте передаваемые сериализованные данные.</p><h2>4. Хранение аутентификационных данных в исходном коде</h2><p>Проблема. Пароли, ключи, токены хранятся в исходном коде или репозитории исходного кода.</p><p>Угроза. Информация из кода может попасть к третьим лицам. Если там хранятся аутентификационные данные, злоумышленник легко получит доступ к системе или ее компонентам.</p><p>Решение. Храните ключи, пароли и токены отдельно от основного кода проекта. Когда потребуется передать их в приложение, делайте это, например, через переменные среды или отдельные конфигурационные файлы.</p><h2>5. Использование непроверенного чужого кода</h2><p>Проблема. Использовать чужой код всегда проще, но если вы его не проверили — это большой риск. Такой код может содержать уязвимости или намеренно оставленные бэкдоры.</p><p>Угроза. Злоумышленник, знающий о существовании уязвимости или бэкдора, может скомпрометировать систему.</p><p>Решение. Не рискуйте без необходимости: обязательно проверяйте чужой код, а лучше всегда обращайтесь к уже зарекомендовавшим себя библиотекам, например GSON, Apache Commons, Bouncy Castle и так далее.</p><h2>6. Использование устаревших версий библиотек и софта</h2><p>Проблема. Устаревшие версии библиотек и ПО содержат уязвимости, информация о которых есть в открытом доступе.</p><p>Угроза. Злоумышленники хорошо осведомлены о таких уязвимостях. Поэтому устаревшие библиотеки, плагины и ПО могут стать входной точкой при компрометации системы. Проэксплуатировать уязвимость может даже неопытный пользователь: в этом помогают общедоступные эксплоиты.</p><p>Решение. Регулярно обновляйте версии библиотек и ПО, которые используете. Также указывайте в конфигурационных файлах конкретные версии библиотек: в будущем это поможет избежать проблем с совместимостью.</p><h2>7. Неграмотное использование криптографии</h2><p>Проблема. Принципы криптографии весьма неочевидны и в попытке изобрести лучшее решение неопытные разработчики используют свои «костыли» вместо проверенных средств.</p><p>Угроза. С непроверенными алгоритмами криптографическая стойкость снижается: уязвимости могут появиться где угодно. Выстроенная защита не работает и злоумышленникам легко ее обойти.</p><p>Решение. Глубоко погружаться в криптографию не обязательно. Но будет полезно узнать общие принципы этой науки, чтобы понимать, когда нужно использовать тот или иной алгоритм, в каких ситуациях необходимо применять шифрование, в каких — цифровую подпись, а в каких и вовсе будет достаточно кодирования.</p><h2>8. Использование паролей по умолчанию или полное отсутствие аутентификации</h2><p>Проблема. В конфигурациях различных сервисов и программных продуктов (базы данных, CMS и т. д.) остаются настройки, заданные по умолчанию.</p><p>Угроза. Слабые пароли или отсутствие аутентификации — прямой путь для доступа злоумышленника к системе и ее компонентам.</p><p>Решение. Не забывайте везде включать аутентификацию и меняйте дефолтные конфигурации на более защищенные. Согласно лучшим практикам кибербезопасности, в первую очередь нужно позаботиться о двух аспектах: сложных паролях и ограничении сетевого доступа к компонентам.</p><h2>9. Игнорирование официальной документации</h2><p>Проблема. В процессе разработки продукта не учтены рекомендации и практики из официальной документации.</p><p>Угроза. Если не задать объектам определенные свойства, качество кода в целом снизится и могут возникнуть уязвимости.</p><p>Решение. Все объекты, с которыми вы работаете, требуют бережного отношения и скрупулезно заданных свойств. Официальная документация — отличный помощник в этом: в ней содержится огромное количество практических советов. Мы регулярно сталкиваемся с ситуациями, когда подход Secure by default совершенно не работает даже в очень популярных open-source-решениях. В таких случаях единственный способ безопасно использовать компонент — внимательно изучать документацию и возможные настройки.</p><h2>10. Проверки на стороне клиента</h2><p>Проблема. Проверки корректности входных данных выполняются исключительно на клиентской стороне.</p><p>Угроза. В серверную часть приложения могут попасть непровалидированные данные, что нередко приводит к уязвимостям (см. п. 1) или нарушениям бизнес-логики.</p><p>Решение. Выполняйте все проверки на стороне сервера приложения. Проверки на стороне клиента — это не мера безопасности, а улучшение пользовательского опыта.</p><h2>11. Недостаточные журналирование и мониторинг</h2><p>Проблема. В системе реализовано недостаточное количество методов журналирования и мониторинга происходящих событий и параметров.</p><p>Угроза. Когда в системе остаются слепые пятна, есть опасность пропустить происходящие в ней аномалии и не заметить атаку злоумышленника.</p><p>Решение. Необходимый объем журналирования и мониторинга — это когда вы можете в любой момент получить представление о том, как функционирует тот или иной компонент системы и какие проблемы в нем возникают. Чтобы не допустить появления слепых пятен в ваших механизмах сбора данных, единые механизмы логирования лучше планировать на этапе проектирования архитектуры системы.</p><p>Ошибки совершают все. Но опытных разработчиков от начинающих отличает умение предвидеть хотя бы некоторые из них. Думать о безопасности, а значит, думать стратегически — это признак профессионала. К такому подходу и стоит стремиться в разработке.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как обеспечить безопасность приложения? 8 ответов от безопасников</title>
      <link>https://tproger.ru/articles/application-security</link>
      <comments>https://tproger.ru/articles/application-security?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/application-security</guid>
      <description><![CDATA[<p>Инъекции, LFI-уязвимости, закладки и слабое шифрование остаются угрозами, а сайты со слабой аутентификацией подвержены высокому риску.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/application-security">Как обеспечить безопасность приложения? 8 ответов от безопасников</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Sep 2020 11:40:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Обеспечить безопасность приложения сложнее, чем может показаться. Уже не так эффективны SQL-инъекции и брутфорс, мы думаем, что за привязкой мобильных устройств и двухэтапной аутентификацией нам ничто не грозит.</p><p>А так ли это на самом деле?</p><h2>Какие уязвимости можно найти в приложении?</h2><p>Ещё живут различные инъекции (SQL, NoSQL, LDAP, OS, XML, XQuery, XPath, XSLT), LFI-уязвимости, закладки (внедрённые в код функции, которые срабатывают в определённый момент), слабые алгоритмы шифрования, небезопасная работа с логами и cookie, а также утечка информации через социнжиниринг.</p><p>Самые опасные уязвимости веб-приложений можно посмотреть на странице <a href="https://owasp.org/www-project-top-ten/">OWASP Top Ten</a>, которая регулярно обновляется.</p><p>И это лишь вершина айсберга.</p><h2>Правда ли, что львиная доля атак приходится на бреши в механизмах аутентификации?</h2><p>Согласно <a href="https://www.ptsecurity.com/ww-en/analytics/web-vulnerabilities-2020/">статистике Positive Technologies</a>, наиболее часто встречающиеся уязвимости веб-приложений за 2019 год связаны с неправильной настройкой безопасности. А вот самому высокому риску подвержены сайты со слабой аутентификацией. Такая проблема была обнаружена в 45% исследованных веб-приложений:</p><figure><img src="https://media.tproger.ru/uploads/2020/09/304693_6.jpg" alt="" /></figure><p>Почти треть таких уязвимостей обусловлена неограниченным количеством попыток войти в аккаунт. Аутентификация только по паролю является тем фактором, который способствует наибольшему количеству атак посредством перебора комбинаций «логин/пароль». Требования к возрасту и сложности пароля, которые раньше были «золотым стандартом», теперь подрывают безопасность. Согласно <a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63-3.pdf">рекомендациям NIST</a>, организациям следует перейти на многофакторную аутентификацию, если они ещё этого не сделали.</p><p>Критически важным элементом безопасности сервиса является система регистрации и аутентификации пользователей. В большинстве случаев вам лучше не делать её с нуля и тем более не использовать пароль как фактор аутентификации. Лучше возложить вообще всю эту функцию на сторонний сервис, например популярную соцсеть или цифровую экосистему.</p><h2>Обеспечение безопасности приложения — это задача безопасников?</h2><p>Не совсем, ведь уже на стадии разработки нужно обращать внимание на очевидные уязвимости.</p><p>Разработчик должен с первой редакции сайта или приложения заложить основные инструменты защиты данных пользователя, например Web Application Firewall. В дальнейшем, с выходом патчей, закрывать появляющиеся уязвимости. В идеальной ситуации разработчик должен либо самостоятельно, либо с привлечением дополнительных специалистов тестировать продукт на проникновение, раз за разом применяя популярные методы взлома и после анализируя полученный результат.</p><h2>Что включает в себя обеспечение безопасности приложения?</h2><p>Это все меры, в том числе и те, которые предшествуют этапу разработки:</p><ol><li>Корректная постановка цикла разработки и деплоя. Это также включает выбор релевантного подхода к разработке (Agile/Waterfall), применение лучших практик DevOps, использование доверенного серверного оборудования.</li><li>В команде должен быть один или несколько специалистов, которые отвечают за информационную безопасность.</li><li>Сформированная модель угроз безопасности — метрики, которые нужно постоянно отслеживать, особенно при каждом обновлении или изменении внешних факторов. Стоит понимать, что модели угроз будут разными для разных приложений.</li><li>Использование технических средств анализа защищённости кода.</li><li>Использование защищённой среды разработки.</li></ol><p>Application security — сложная задача, особенно в больших командах. Здесь важна грамотная работа архитекторов, которая предусмотрит механизмы безопасности для каждого из «кирпичиков» проекта, тем самым обеспечивая многоуровневую защиту продукта.</p><h2>Какими бывают технические средства анализа защищённости кода?</h2><p>Основной пласт анализаторов включает в себя:</p><ul><li>Статические — это анализаторы исходного кода на базе механизма статического анализа (SAST). Проверка происходит без запуска самой программы на промежуточных этапах разработки или на этапе сборки. К SAST-решениям относятся Synopsys, AppScan, Checkmarks, Veracode, Appercut, Application Inspector, Micro Focus.</li><li>Динамические — применяются к готовому коду и ориентированы в основном на веб-приложения. Работают на базе динамического тестирования безопасности (DAST) через подачу URL-адреса в автоматический сканер.</li><li>Интегрированные в CI (Continuous Integration) — сканируют статический и динамический код.</li><li><a href="https://tproger.ru/articles/best-kali-linux-tools/">Инструменты пентестера</a>.</li></ul><h2>Как создать защищённую среду разработки?</h2><p>Стоит помнить, что обеспечить безопасность приложения можно только комплексно, поэтому уделяйте внимание каждому из этапов:</p><ol><li>Сегментировать сеть и организовать управление сетевыми проходами.</li><li>Настроить права доступа для каждой роли.</li><li>Хранить пароли в хешированном виде с применением так называемой соли.</li><li>Организовать защищённый удалённый доступ.</li><li>Управлять обновлениями.</li><li>Мониторить и документировать.</li><li>Обезличивать важные данные при работе с БД в тестовом режиме.</li></ol><h2>На что должен обращать внимание разработчик, чтобы защитить приложение от взлома?</h2><p>Позаботиться о безопасности сервиса лучше на самых ранних этапах его разработки. В этом помогут проекты от сообщества OWASP, например руководства «Проактивная защита: Топ-10 требований OWASP» (набор практик для изначального повышения безопасности приложения) и рейтинг 10 самых опасных угроз безопасности веб-приложений OWASP Top 10. Также важным является включение безопасности как составляющей цепочки CI/CD вашего приложения, например использование SAST и DAST-решений. Причём необязательно сразу покупать и внедрять коммерческие решения, ведь существуют и вполне достойные варианты из мира свободного ПО.</p><p>По моему опыту, один из главных шагов к безопасности приложения — это ограничение функциональности для каждого пользователя по принципу need-to-know. Этот принцип возник в военной среде, однако полезен и в разработке: соблюдая его, вы не даёте пользователю получать больше информации, чем ему нужно.Не менее важны процессы код-ревью и независимого анализа защищённости. Для второго можно привлекать собственную команду безопасности, обращаться в специализированные компании или добавить приложение в программу bug bounty, чтобы сотни исследователей со всего мира непрерывно искали за вас баги.Также важно изучать уязвимости чужого кода, который вы вносите в проект: посмотрите issue на GitHub, проверьте продукт в базе уязвимостей. Есть замечательный проект наших коллег Vulners, который агрегирует данные по существующим уязвимостям из различных источников.</p><p>На заключительных этапах разработки не будет лишним позаботиться о защите кода от чтения и дизассемблирования. Здесь тоже имеются проверенные временем методики: от простой обфускации до применения ассемблерных вставок и продвинутых средств защиты от отладчиков. Вообще, хорошей практикой является «чистка» кода перед отправкой его в продакшн. Пользователю ведь никак не помогут комментарии, объясняющие, как работает тот или иной вызов либо функция. А вот для атакующего это большое подспорье при анализе продукта. Кроме того, следует избегать прописывания различных конфиденциальных данных внутри самого кода. Например, не рекомендуется встраивать ссылки с данными авторизации на сервере для автоматического тестирования.</p><h2>А как обстоят дела с безопасностью мобильных приложений?</h2><p>Безопасная разработка мобильного приложения включает три этапа.Во-первых, важно заранее учитывать, что приводит к уязвимостям, и ещё во время разработки предусмотреть все меры профилактики. Так, для предотвращения утечки данных необходимо использовать криптографические алгоритмы, многофакторную аутентификацию, генерировать непредсказуемые идентификаторы сессии и хранить авторизационные токены в наиболее безопасных частях операционной системы.Безопасность передачи информации осуществляется за счёт подтверждения достоверности источников связи, корректных версий SSL и проверки согласования. Права доступа к скрытым разделам приложения необходимо давать только узкому кругу ответственных за них специалистов.Далее необходимо протестировать приложение на предмет наличия подобных уязвимостей. В основном используются методы белого и чёрного ящика. Метод белого ящика (статистическое тестирование безопасности SAST) подразумевает проверку разработчиком, имеющим доступ к коду. Метод чёрного ящика предполагает анализ только пользовательского опыта, без оценки кода. Тестировать можно вручную или с помощью специальных сервисов.И последнее, перед собственно отработкой выявленных уязвимостей расставьте приоритеты. В первую очередь устраните ошибки, при которых работа приложения невозможна. Затем идут критические баги: зависание системы или временные падения. После смотрите на ошибки, не влияющие на работу, например, недочёты дизайна. В самом конце устраняйте мелкие баги.Рекомендую использовать параметризованные запросы к базе данных, не конструировать запросы внутри системы, для доступа к БД использовать отдельную учётку и не забывать про журналы безопасности.</p><h2>Резюмируя</h2><p>Чтобы понять, как обеспечить безопасность приложения, следует изучить наиболее опасные уязвимости, учесть это на стадии разработки и тестирования, при выявлении — устранить и обязательно задокументировать все найденные проблемы, чтобы избежать их в дальнейшем. Не стоит также забывать об анализаторах и безопасности самой среды разработки.</p><p>Если же вы не до конца разобрались во всех нюансах, ищете дополнительные инструменты и полезные ссылки, советуем заглянуть в нашу статью о <a href="https://tproger.ru/translations/webapp-security/">защите веб-приложения</a>, которая вобрала в себя максимум полезной информации.</p>]]></content:encoded>
    </item>
    <item>
      <title>Acronis открыла доступ к API новой облачной платформы Acronis CyberPlatform</title>
      <link>https://tproger.ru/news/acronis-cyberplatform-api</link>
      <comments>https://tproger.ru/news/acronis-cyberplatform-api?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/acronis-cyberplatform-api</guid>
      <description><![CDATA[<p>В системе уже 500 тысяч компаний и 5 миллионов конечных пользователей, которым сторонние разработчики и провайдеры могут предлагать свои приложения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/acronis-cyberplatform-api">Acronis открыла доступ к API новой облачной платформы Acronis CyberPlatform</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Apr 2019 10:03:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Acronis сегодня открывает доступ к API новой облачной платформы Acronis CyberPlatform. В системе уже существует 500 тысяч компаний и 5 миллионов конечных пользователей. Сторонние разработчики, провайдеры и независимые поставщики ПО могут предлагать им свои приложения.</p><h2>Что могут делать разработчики</h2><ul><li>Реализовать резервное копирование новых источников данных.</li><li>Убедиться, что данные резервного копирования хранятся в месте назначения, которое соответствует финансовым требованиям или требованиям соответствия.</li><li>Включить в работу анализ и обработку данных на платформе, например, добавление метаданных, возможности глубокого поиска или специальные схемы шифрования.</li><li>Предлагать управляемые услуги и поддержку приложений SaaS для клиентов и конечных пользователей, а затем объединять решения для кибербезопасности.</li><li>Интегрировать технологии Acronis в свои приложения, системы и облачные торговые площадки.</li></ul><p>Ещё Acronis провела ребрендинг своих продуктов.</p><p>Acronis Cyber Cloud (ранее Acronis Data Cloud) — это платформа, позволяющая сервис-провайдерам предоставлять клиентам киберзащиту. В ближайшем обновлении будет доступна функция резервного копирования G Suite и защита от криптомайнинга.</p><p>Acronis Cyber Infrastructure (ранее Acronis Software-Defined Infrastructure) — это масштабируемое решение для создания программно определяемой инфраструктуры на базе стандартного оборудования. Оно поддерживает все виды нагрузок для работы с данными.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google представила Asylo, фреймворк для разработки анклавных приложений</title>
      <link>https://tproger.ru/news/google-asylo-framework</link>
      <comments>https://tproger.ru/news/google-asylo-framework?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ольга Дергач]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-asylo-framework</guid>
      <description><![CDATA[<p>Фреймворк Asylo выносит чувствительную часть приложения в защищённый анклав TEE без изменения кода программы, код открыт и универсален.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-asylo-framework">Google представила Asylo, фреймворк для разработки анклавных приложений</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 08 May 2018 21:09:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда Asylo <a href="https://asylo.dev/blog/2018/announcing-asylo.html">анонсировала</a> новый фреймворк для анклавных приложений, который позволяет выносить часть функциональности, требующей повышенной защиты, на сторону защищённого анклава (TEE). Стоит отметить, что перенесение компонентов в анклавы осуществляется без изменения кода программы.</p><h3>Использование анклавов</h3><p>Работа с анклавами подразумевает разделение приложения на две части: исходный код и защищённая часть для анклава. В качестве компонентов, требующих повышенной защиты, могут быть выбраны коды шифрования и аутентификации, любые конфиденциальные данные, ключи и пароли. Также TEE помогает защищаться от атак, нацеленных на операционную систему, гипервизор, драйверы и прошивку.</p><p>Ранее разработка и запуск приложений в TEE требовали специальных знаний, инструментов и имели привязку к конкретным аппаратным средам. С Asylo исчезла необходимость получать дополнительные знания для разработки анклавных приложений.</p><figure><img src="https://media.tproger.ru/uploads/2018/05/Anclav1.jpg" alt="" /></figure><h3>Преимущества Asylo</h3><p>Разработчики <a href="https://cloudplatform.googleblog.com/2018/05/Introducing-Asylo-an-open-source-framework-for-confidential-computing.html">выделяют</a> следующие преимущества использования фреймворка:</p><ul><li>не требуется изучение новой модели программирования или переписывание кода приложения;</li><li>перенос компонентов в анклавы осуществляется без изменения исходного кода;</li><li>повышенный уровень безопасности приложений благодаря открытому доступу к коду.</li></ul><p>Компоненты Asylo <a href="https://github.com/google/asylo/tree/master/asylo/examples/quickstart/solution">находятся</a> в свободном доступе на GitHub. Скачать фреймворк и ознакомиться с документацией можно <a href="https://asylo.dev/">здесь</a>.</p><p>Напомним, что Google активно разрабатывает собственную операционную систему. В феврале компания представила кроссплатформенный фреймворк для разработки пользовательских интерфейсов под названием Flutter. О нём <a href="https://tproger.ru/news/flutter-beta-1/">можно почитать</a> в нашем материале.</p>]]></content:encoded>
    </item>
    <item>
      <title>Создана новая техника внедрения кода, способная обойти большинство современных антивирусов</title>
      <link>https://tproger.ru/news/process-doppelganging-new-code-injection-technique</link>
      <comments>https://tproger.ru/news/process-doppelganging-new-code-injection-technique?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/process-doppelganging-new-code-injection-technique</guid>
      <description><![CDATA[<p>Техника внедрения кода Process Doppelgänging использует транзакции NTFS и прошла проверку на популярных антивирусах, которые не обнаружили атаку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/process-doppelganging-new-code-injection-technique">Создана новая техника внедрения кода, способная обойти большинство современных антивирусов</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 10 Dec 2017 13:17:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>На прошедшей конференции Black Hat Europe 2017 специалисты компании enSilo <a href="https://www.blackhat.com/eu-17/briefings.html#lost-in-transaction-process-doppelg%C3%A4nging">представили</a> новую технику внедрения кода, получившую название Process Doppelgänging. Этот вид атаки неуловим для большей части современных антивирусных программ и представляет опасность для всех версий операционной системы Windows.</p><h3>Что ты такое?</h3><p>Process Doppelgänging во многом похожа на технику Process Hollowing. Она так же создает копию ожидающего легитимного процесса с последующей подменой оригинала на «зараженный». Главное отличие новой разработки — это работа через транзакции NTFS, позволяющая избежать использования подозрительных процессов в памяти. Запущенный подобным образом код способен ловко обойти защитные механизмы стандартных алгоритмов поиска вируса.</p><p>Новая техника была успешно протестирована на самых популярных антивирусах — ни одному из них не удалось выявить атаку.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/bypass-test.png" alt="" /></figure><p>Однако, по словам исследователей, пока что рано бить тревогу. Для использования этого инструмента хакерам необходимо разбираться в «недокументированных деталях о создании процессов». К тому же компания enSilo уже разработала алгоритмы обнаружения Process Doppelgänging. Правда, выпуск патчей для новой техники — задача неосуществимая, так как атака работает с фундаментальными функциями Windows.</p><p>Информация о деталях реализации Process Doppelgänging <a href="https://www.blackhat.com/docs/eu-17/materials/eu-17-Liberman-Lost-In-Transaction-Process-Doppelganging.pdf">доступна</a> в официальной презентации.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft анонсировала новый инструмент для обнаружения ошибок памяти</title>
      <link>https://tproger.ru/news/microsoft-vulnscan</link>
      <comments>https://tproger.ru/news/microsoft-vulnscan?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-vulnscan</guid>
      <description><![CDATA[<p>VulnScan в Microsoft Security Risk Detection использует фаззинг для поиска ошибок памяти и показывает их тип и первопричину в отчёте.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-vulnscan">Microsoft анонсировала новый инструмент для обнаружения ошибок памяти</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 04 Oct 2017 16:05:43 GMT</pubDate>
      <content:encoded><![CDATA[<p>Новая утилита, названная VulnScan, будет частью облачного сервиса <a href="https://blogs.microsoft.com/ai/2017/07/21/ai-for-security-microsoft-security-risk-detection-makes-debut/">Microsoft Security Risk Detection</a>, который позволит пользователям загружать свои приложения для автоматического тестирования на присутствие различных проблем. Данный сервис до сих пор находится в стадии бета-тестирования.</p><p>Большинство утилит и функций платформы Microsoft Security Risk Detection работают по принципу <a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B7%D0%B7%D0%B8%D0%BD%D0%B3">фаззинга</a>, при котором приложению на вход подаётся случайный набор данных и анализируются аномалии выходных данных для определения возможных уязвимостей.</p><p>Большинство обнаруживаемых ошибок связано с ошибками памяти. VulnScan обнаруживает их тип и первопричины, чтобы разработчики и инженеры смогли вовремя устранить бреши в системе безопасности исследуемых приложений. Результатом работы сервиса будет отчёт, подобный представленному на сайте разработчиков.</p><figure><img src="https://media.tproger.ru/uploads/2017/10/MSRC-VulnScan-Report.png" alt="" /></figure><h3>Тесты Microsoft</h3><p>В Microsoft уверяют, что VulnScan способен обнаруживать ошибки следующих типов: выход за пределы областей чтения и записи, использование переменной после освобождения памяти, использование неинициализированной памяти, путаница типов, разыменование указателей на null и указателей на константу.</p><p>VulnScan базируется на двух других инструментах Microsoft — Debugging Tools для Windows (WinDbg) и Time Travel Debugging (TTD). <a href="https://blogs.technet.microsoft.com/srd/2017/10/03/vulnscan-automated-triage-and-root-cause-analysis-of-memory-corruption-issues/">По словам</a> Матеуша Крживицкого из центра Microsoft Security Response (MSRC), компания использует VulnScan в течение последних 10 месяцев для обработки проблем, связанных с памятью и обнаруженных в Microsoft Edge, Microsoft Internet Explorer и Microsoft Office. Примерно в 85% случаев сервис успешно обнаружил проблемы, что позволило сэкономить около 500 часов рабочего времени инженеров MSRC.</p><figure><img src="https://media.tproger.ru/uploads/2017/10/Vulnscan-Success-Rate.png" alt="" /></figure><h3>Как воспользоваться VulnScan?</h3><p>Разработчики и организации могут подать заявку на использование бета-версии сервиса и протестировать его бесплатно до официального запуска службы. Стоит отметить, что после запуска она скорее всего обзаведётся платной подпиской.</p><p>В то время, как Microsoft за большинство своих продуктов требует оплаты, Google делает многие свои продукты для фаззинга Open Source проектами, включая утилиты <a href="https://tproger.ru/news/safari-most-insecure/">Domato</a> и <a href="https://tproger.ru/news/oss-fuzz-five-months-later/">OSS-Fuzz</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Страх и ненависть на сервере, или Можно ли написать сайт в Excel</title>
      <link>https://tproger.ru/translations/html-site-in-excel-omg</link>
      <comments>https://tproger.ru/translations/html-site-in-excel-omg?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/html-site-in-excel-omg</guid>
      <description><![CDATA[<p>Воган Мэй собрал файл Excel, который генерирует из своего содержимого сайты на Bootstrap: VBA работает со строками, логическими операторами и HTTP.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/html-site-in-excel-omg">Страх и ненависть на сервере, или Можно ли написать сайт в Excel</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Oct 2016 21:28:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Воган Мэй</p><p>В заголовке не шутка: я сам попробовал, вполне получилось.</p><figure><img src="https://media.tproger.ru/uploads/2016/10/screenshot3.png" alt="" /></figure><p>Итак, представляю вашему вниманию <a href="https://github.com/woganmay/excel-bootstrap/blob/master/excel-bootstrap.xlsm">файл</a> в формате Excel, который умеет генерировать из своего содержимого сайты на Bootstrap.</p><h3>Господи, зачем?!</h3><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-20_00_26-slack-za-tech.png" alt="" /></figure><p>А почему нет? Как мне известно, VBA умеет совершать операции со строками и имеет логические операторы, а также может работать с HTTP. Что еще нужно?</p><p>Еще мне захотелось просто поэкспериментировать с VBA. Несмотря на всеобщую ненависть среди программистов, Excel — удобная для определенных целей платформа, и мне было интересно приложить ее к какой-нибудь нестандартной пугающей задаче.</p><p>На самом деле мне вообще очень не нравится дифференциация на “элитные” и “плохие” языки программирования. Существует такая точка зрения (порождающая адские холивары), что некоторые языки и платформы во всем лучше остальных и что есть такие, которые лучше никогда не использовать. Разве это объективно?</p><p>Итак, я попробую делать сайты с помощью Excel. И никто не сумеет меня остановить.</p><h3>Как это работает</h3><p>Книга лежит в открытом доступе — для начала <a href="https://github.com/woganmay/excel-bootstrap">скачайте</a> ее, если вам интересно все попробовать лично.</p><p>Пользоваться ею очень просто — на главном листе можно заполнять текстом ячейки, а потом макрос генерирует выходной HTML. Есть даже возможность управлять компонентами — ненужные части страницы можно отключить.</p><p>Результаты записываются в html-файл. В принципе, вам только он и нужен — весь CSS и JavaScript лежит на CDN-сервере. И вот у вас уже готова минимальная страничка, еще и на Bootstrap!</p><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-19_58_37-my-first-excel-bootstrap-website.png" alt="" /></figure><p>На нее можно даже поставить Bootstrap-тему! Вам будет дан список на выбор.</p><p>Теперь настало время поделиться своим творением с миром. У меня тут завалялся свободный сервер, так что я по-быстрому прицепил к нему домен excel-bootstrap.cf, установил Apache с LetsEncrypt, и получился настоящий хостинг (с самым минимальным уровнем безопасности).</p><p>Под “минимальным уровнем безопасности” я имею в виду этот супер-скрипт на PHP:</p><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-20_02_53-index-php-bs-visual-studio-code.png" alt="" /></figure><p>Есть еще четырехстрочный .htaccess, но он особого интереса не представляет.</p><p>По сути, на моем неподражаемом хостинге этот скрипт просто ищет файл с подходящим названием и выводит его на страницу. Если пытаются обратиться к корню сайта — переадресует на GitHub-репозиторий проекта.</p><p>Даже есть вышеупомянутые зачатки безопасности: размещать файлы вы можете, только имея правильный GUID. Конечно, там могут быть какие-то лазейки, которые отыщет опытный хакер, но не забывайте, я написал все это за 10 минут.</p><h3>В продакшн!</h3><p>На всю работу ушло менее 3 часов. Давайте расскажу подробнее, на какую часть работы сколько ушло.</p><p>Принцип “быстрой разработки” идеален, когда мы реализуем какую-то совершенно новую идею. Нужно добиться минимально рабочего результата, а украшать его уже по ходу дела.</p><p>Где-то за 34 минуты я обрисовал идею и реализовал макет.</p><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-20_10_16-slack-za-tech.png" alt="" /></figure><p>Потом создал репозиторий на GitHub, написал маленькое readme — и настало время делать сам проект.</p><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-20_11_37-slack-za-tech.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-20_15_01-slack-za-tech.png" alt="" /></figure><p>Я быстренько зарегистрировал на себя домен excel-bootstrap.cf, прицепил к серверу, создал для него неповторимое API (на картинке видно, как оно используется) и добавил в книгу возможность загружать на мой сервер сгенерированные файлы.</p><figure><img src="https://media.tproger.ru/uploads/2016/10/2016-10-14-20_18_45-microsoft-visual-basic-for-applications-excel-bootstrap-xlsm-module1-code.png" alt="" /></figure><p>В процессе работы:</p><ul><li>Всего затрачено времени: 2 часа 15 минут.</li><li>Всего потеряно единиц IQ за время создания: неизвестно.</li></ul><h3>И ради чего все это?</h3><p>Вообще мне просто захотелось посмотреть, насколько бессмысленное и ужасное творение я способен создать. Но это была не единственная цель. Главная мысль, которую я хочу до вас донести этим адом: нет правильных и неправильных способов что-либо делать.</p><p>Буду я еще когда-нибудь писать сайты в Excel? Да ни за что в жизни.</p><p>Найдется ли какой-нибудь незадачливый бизнесмен, которому понравится идея сделать страничку для своей компании в родной и привычной программе? Вполне может быть.</p><p>А кто может оценить, насколько верен выбранный путь? Да никто.</p><p>Итак, мораль.</p><blockquote>Выбирая инструмент для выполнения задачи — берите тот, которым вы лучше всего владеете, тот, который вы сможете использовать еще долго и тот, на котором вы способны довести работу до конца. Но не тот, который посоветуют умные дяди с форума.</blockquote><p>Выбирая канал для отслеживания интересных публикаций, тоже руководствуйтесь соображениями удобства. <a href="https://tproger.ru/channels/">Подписывайтесь на нас и следите за статьями там, где вам удобно.</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Самые интересные доклады с PyCon 2016</title>
      <link>https://tproger.ru/video/pycon-2016-experienced</link>
      <comments>https://tproger.ru/video/pycon-2016-experienced?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Антон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/pycon-2016-experienced</guid>
      <description><![CDATA[<p>Записи выступлений крупнейшей конференции по Python: среди докладов для опытных разработчиков — жизненный цикл класса от Майка Грэма.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/pycon-2016-experienced">Самые интересные доклады с PyCon 2016</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Jun 2016 21:37:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Недавно на YouTube <a href="https://www.youtube.com/channel/UCwTD5zJbsQGJN75MwbykYNw/feed">были опубликованы</a> почти все видеозаписи выступлений с <a href="https://us.pycon.org/2016/">PyCon 2016</a>. Это мероприятие является крупнейшей конференцией, посвященной языку программированию Python, спикерами которой являются известные разработчики сообщества.</p><p>В этой статье собрано несколько интересных докладов с PyCon этого года, ориентированных на опытных Python-разработчиков.</p><h3>Жизненный цикл класса в Python</h3><p>В ходе своего <a href="https://us.pycon.org/2016/schedule/presentation/2074/">выступления</a> Майк Грэм — разработчик Edgestream Partners, создающий приложения, ориентированные на высокую производительность — создает простой класс на Python и отслеживает все с ним происходящее на различных этапах его жизненного цикла: от объявления до уничтожения сборщиком мусора.</p><h3>Объяснение статистики с помощью Python</h3><p>Три наглядных доклада были посвящены математической статистике. В <a href="https://us.pycon.org/2016/schedule/presentation/1576/">первом</a>, озаглавленном как «Статистика для хакеров», профессор Университета Вашингтона Джейк Вандерплас использует программы на Python для демонстрации методов теории вероятностей и математической статистики.</p><p>Два других доклада — от профессора Алена Дони — преследуют ту же цель: объяснить предмет не столько математически, сколько «вычислительно». <a href="https://us.pycon.org/2016/schedule/presentation/2273/">Один из них</a> посвящен вычислительным методам в статистике вообще, а <a href="https://us.pycon.org/2016/schedule/presentation/1720/">второй</a> демонстрирует явления байесовской статистики.</p><h3>Использование «еще более крутых фич» Python</h3><p>В <a href="https://us.pycon.org/2016/schedule/presentation/1755/">выступлении</a> Майкла Мюллера — одного из преподавателей Python Academy — рассказывается о правильном применении дескрипторов и метаклассов. Цель доклада — научить слушателей грамотно реализовывать их самостоятельно.</p><h3>Безопасные расширения для Python на C</h3><p>Где-то между Python и C находится CPython API, использование которого сопряжено с разнообразными трудностями — например, управлением памятью. Пол Росс <a href="https://us.pycon.org/2016/schedule/presentation/2125/">берется</a> приподнять завесу тайны в подобных вопросах, рассказав о разнообразных шаблонах проектирования, упрощающих процесс разработки расширений и повышающих производительность создаваемых модулей.</p><p>Рекомендуем вам также самостоятельно взглянуть на списки <a href="https://us.pycon.org/2016/schedule/talks/">докладов</a> и <a href="https://us.pycon.org/2016/schedule/tutorials/">руководств</a> на официальном сайте конференции.</p><p>Также обратите внимание на <a href="https://tproger.ru/links/py-must-watch">еще одну</a> подборку видео по Python, которые стоит посмотреть.</p>]]></content:encoded>
    </item>
  </channel>
</rss>