3 177
订阅者
-124 小时
-17 天
-930 天
帖子存档
+4
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-61539, обнаруженная в Xinference в версиях до 2.7.0, приводит к Remote Code Execution (RCE) [fix].
🐛 CVE-2026-77815, обнаруженная в Infinite Image Browsing в версиях до 1.8.0 включительно, приводит к Path Traversal [fix].
🐛 CVE-2026-71513, обнаруженная в NLTK в версиях до 3.10.3, приводит к Insecure Deserialization [fix].
🐛 CVE-2026-62316, обнаруженная в Microsoft UFO в версиях до 3.0.8, приводит к Server-Side Request Forgery (SSRF) [fix].
🐛 CVE-2026-49436, обнаруженная в LinkAce в версиях до 2.5.7, приводит к Cross-Site Scripting (XSS) [fix].
Всем отставить созвоны, и бегом в правильную часть пятницы (седьмой час уже, имейте совесть)!
Всем, кто уже в пути: благополучно добраться, достойно встретить и приятно провести чудесные выходные 🤗
Оставляем новый формат постов о CVE (с картинками)?
+4
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-71964, обнаруженная в CyberPanel в версиях до 2.4.3 включительно, приводит к Arbitrary File Reading [fix].
🐛 CVE-2026-72908, обнаруженная в ERPNext в версиях до 15.109.0 и 16.20.0, приводит к SQL Injection [fix].
🐛 CVE-2026-73222, обнаруженная в Claude Code Templates в версиях до 1.29.4, приводит к Remote Code Execution (RCE) [fix].
🐛 CVE-2026-73228, обнаруженная в Django REST framework в версиях до 3.17.2, приводит к Uncontrolled Resource Consumption (DoS) [fix].
🐛 CVE-2026-73498, обнаруженная в MCP Atlassian в версиях до 0.22.0, приводит к Path Traversal [fix].
+9
Что может быть грустнее, чем последняя пятница в отпуске? 🥺
Правильно, много чего. Потому что пятница — есть пятница, как ни крути. Так что, всем взбодриться (мемы в помощь) и уверенным шагом отправляться в её правильную часть!
А, и чудесных всем выходных ещё 🙈
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-53992, обнаруженная в ProjectSend в версиях r1945 - r2098, приводит к Cross-site Scripting (XSS). Проблема заключалась в прямом использовании параметров запроса ($_GET['start_date'] и $_GET['end_date']) в HTML-атрибутах полей фильтра без экранирования. В исправлении разработчики стали оборачивать оба параметра в htmlspecialchars($_GET[...], ENT_QUOTES, 'UTF-8') непосредственно при их чтении.
🐛 CVE-2026-70609, обнаруженная в Electron версиях до 39.8.7, 40.9.0, 41.2.0 и 42.0.0-beta.1, приводит к Remote Code Execution (RCE). Проблема заключалась в том, что dock_state_, полученный из аргумента mode функции webContents.openDevTools() или сохранённых настроек DevTools, подставлялся напрямую в строку JavaScript-кода для выполнения скрипта в контексте DevTools. В исправлении разработчики добавили функцию IsValidDockState(), сверяющую значение с фиксированным набором {"bottom","left","right","undocked"}.
🐛 CVE-2026-71313, обнаруженная в rclone версий с 1.51.0 по 1.75.0, приводит к Path Traversal. Проблема заключалась в том, что localPath() строила путь к файлу через filepath.Join(f.root, ...). В исправлении разработчики добавили в localPath() проверку filepath.Rel(f.root, localPath) и возврат ошибки errPathEscapes, если результат выходит за пределы root.
🐛 CVE-2026-71319, обнаруженная в Nuxt DevTools до версии 3.3.1, приводит к Remote Code Execution (RCE). Проблема заключалась в том, что RPC-методы updateOptions(), clearOptions() и openInEditor() не требовали токена, а openInEditor() запускал launch-editor как дочерний процесс с путём, настраиваемым через тот же updateOptions(). В исправлении разработчики добавили обязательный параметр token в эти методы, проверяемый через ensureDevAuthToken() перед выполнением.
🐛 CVE-2026-71434, обнаруженная в Statamic CMS до версий 5.74.3 и 6.24.2, приводит к Unrestricted File Upload. Проблема заключалась в том, что FrontendFormRequest::extraRules() применяла правило AllowedFile только к полям assets, не подмешивая правила валидации настроенного AssetContainer, а для полей files ограничение по расширению вообще не задавалось. В исправлении разработчики распространили extraRules() на оба типа полей, подмешав allowed_extensions для files и validationRules() контейнера для assets.
Кто рано встает... тот уже не спящего в такую рань в отпуске админа застает 🙂
Но заметьте — админа, не забывшего, что 3К+ человек всю неделю терпят тут всякие странные посты ради того, чтобы насладиться пятничными мемами 🤗
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-63221, обнаруженная в CodeIgniter4 в версиях с 4.3.0 по 4.7.3, приводит к SQL Injection. Проблема заключалась в том, что внутренний метод
_deleteBatch() при формировании запроса на удаление подставлял связанные значения из условий where() напрямую в запрос, что позволяло внедрить и выполнить произвольный SQL код. В исправлении разработчики вынесли обработку значений в новый метод convertWhereBindsForBatch(), который обрабатывает значения через db->escape() перед их подстановкой в SQL.
🐛 CVE-2026-67346, обнаруженная в Swarms до версии 6.8.1, приводит к Server-Side Request Forgery (SSRF). Проблема заключалась в том, что функция _is_safe_url() проверяла только IP-адрес, указанный непосредственно в URL, но не анализировала доменные имена, что позволяло злоумышленнику заставлять сервер обращаться к произвольным хостам. В исправлении разработчики добавили проверку IP-адресов, полученных в результате DNS-разрешения имени хоста, и начали отклонять URL, которые указывают на приватные диапазоны адресов.
🐛 CVE-2026-67438, обнаруженная в OliveTin в версиях с 3000.2.0 по 3000.17.x, приводит к OS Command Injection. Проблема заключалась в том, что функция checkShellArgumentSafety() не считала пользовательские типы аргументов с префиксом regex: небезопасными для Shell-режима, что позволяло злоумышленниу передать значение, удовлетворяющее регулярному выражению, и выполнить произвольные команды операционной системы. В исправлении разработчики начали рассматривать все типы аргументов с префиксом regex: как небезопасные для Shell-режима и запретили их использование при формировании shell-команд.
🐛 CVE-2026-54705, обнаруженная в MathLive до версии 0.110.0, приводит к Cross-Site Scripting (XSS). Проблема заключалась в том, что команды \text{} и \mbox{} сохраняли специальные HTML-символы без экранирования и затем напрямую включали их в сформированную HTML- и MathML-разметку, что позволяло злоумышленнику внедрить вредоносный HTML- или JavaScript-код, который выполнялся при отображении математического выражения. В исправлении разработчики добавили экранирование специальных HTML-символов при формировании HTML- и MathML-представлений текстовых элементов.
🐛 CVE-2026-54662, обнаруженная в swagger-typescript-api до версии 13.12.2, приводит к Remote Code Execution (RCE). Проблема заключалась в том, что значение servers[0].url из OpenAPI-спецификации без экранирования вставлялось в поле baseUrl сгенерированного TypeScript-клиента, что позволяло злоумышленнику сформировать специально подготовленную OpenAPI-спецификацию, внедрить произвольный TypeScript-код и добиться его выполнения при импорте сгенерированного модуля. В исправлении разработчики добавили экранирование строковых литералов JavaScript через функцию escapeJsStringLiteral().Repost from Искусство. Код... ИИ?
🔎 Ковыряем Codex Security
OpenAI выложили @openai/codex-security — CLI и TypeScript-SDK для поиска, валидации и фикса уязвимостей в коде. Самое время заглянуть внутрь.
Проект
Сам пакет построен поверх
@openai/codex и @openai/codex-sdk. В src/ около 13,7 тыс. строк TypeScript, логика скана вынесена в _bundled_plugin/. Это бандл из 13 скиллов (каждый со своим субагентом), MCP-сервера, 32 Python-скриптов, реф-документов (references/) и JSON-схем (schemas/: coverage, findings, scan-manifest).
Как оно работает
Сначала threat-model строит модель угроз, затем оркестратор security-scan гоняет файлы через finding-discovery, который ищет кандидатов на уязвимости. Каждый кандидат проходит validation и attack-path-analysis (цепочка source → контроль → sink). В финале идут фиксы, и формирование отчёта. Из 13 скиллов основными остаются именно эти 5, плюс триаж, отчетность и харденинг.
Классы уязвимостей
Таксономия в проекте задана набором примеров в скиллах, прежде всего в severity-policy и finding-discovery, и сами документы отмечают их как «не исчерпывающие». На практике границы охвата задаёт то, что модель сама распознает как уязвимость, детерминированного списка правил нет. В документах упомянуты семейства:
- Инъекции: Command Injection, SQL/NoSQL/LDAP/XPath Injection, SSTI, XXE, XSS, Path Traversal, LFI/AFR/AFW, SSRF.
- Контроль доступа: обход авторизации и IDOR, нарушения границ доверия, обход аутентификации и захват аккаунта, CSRF на критичных действиях, повышение привилегий.
- Данные: утечка секретов, PII, ключей подписи и весов моделей, URL-импортёры и callback-клиенты.
- Выполнение кода и память: повреждения памяти, побеги из песочниц, контейнеров, VM и интерпретаторов, небезопасная десериализация (pickle, yaml, кодеки), опасные загрузки файлов, абьюз плагинов и макросов.
- Прочее: криптографические ошибки, уязвимости цепочки поставок, хардкод кред, логические уязвимости с нарушением целостности данных, DoS через исчерпание ресурсов.
Нейросимвольность
За моделью оставлена вся нечёткая часть работы: рассуждение о достижимости пути, контексте, намерениях разработчика. Формальная же логика сосредоточена в py-скриптах: ранжирование файлов, нормализация кандидатов, валидация контракта скана, генерация report.md и SARIF.
Скиллы весьма объёмны и пестрят оговорками вида «do not», «never», «must». По ним, при желании, можно восстановить всю историю боли и страданий разработчиков, занимавшихся отладкой этого проекта 🤗
Поддерживается режим --mode deep, который сводится к многократному независимому запуску discovery (--max-discovery-runs 10, --stop-after-no-new 3) с последующим слиянием кандидатов на проверку. Смысл тут в том, что из-за недетерминизма LLM, для поднятия полноты и покрытия, нужно прогнать поиск несколько раз и взять объединение результатов. Настраивать агрессивность можно руками: --workers, --subagents, --effort .... И да, это недёшево — модуль cost.ts как бы намекает. Глубокий прогон среднего репозитория (~60 KLoC, связка c0wrk и sp4rk) обходится в десятки миллионов токенов. Точность анализа при этом весьма высокая, если включать глубокий режим (проверял на ShopVault — у gpt-5.6 knowledge cut-off августа 2025, вроде, т.ч. пока норм).
Окружение и защита
Безопасность рантайма базово есть. Модуль trusted-executable чистит PATH, чтобы агент ненароком не запустил лишнего, и защищает от подсунутых в репу бинарников, учитывает симлинки и специфику Windows. Для пакетных задач есть докер-сканы, опциональный AppArmor-профиль. Есть коннекторы к GitHub, Linear и Atlassian, API-ключи для CI в систему не пишутся.
Pro/Cons
➕ Построение атакуемых трасс, разумное разделение между LLM и формальным слоем, лаконичная, но эффективная защита.
➖Полнота держится на детерминизме модели и количестве перезапусков, что делает каждый скан непрогнозируемой историей. Количественных бенчмарков нет, правила поверхностны, и полагаются на знания LLM.
⚠ TL;DR: в пайплайне лишним не будет. Если токенов не жалко.
#ИИ_безопасность #ИИ_инструментыЧто может быть лучше медленно надвигающейся правильной части пятницы? Верно: медленно надвигающаяся правильная часть пятницы в отпуске 🦄
Так что, просьба с пониманием отнестись к возможным перебоям в своевременных поставках мемов следующие две недели.
Главное, чтобы это никого до деплоя в пятницу вечером не довело 🙏
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-54910, обнаруженная в FileBrowser Quantum до версии 1.4.3-beta, приводит к Path Traversal. Проблема заключалась в том, что эндпоинт GET
/api/media/subtitles использовал переданные пользователем параметры path и name при работе с файловой системой без проверки, что позволяло любому авторизованному пользователю читать доступные процессу сервера файлы, включая ключи, учётные данные и конфигурацию. В исправлении разработчики отказались от непосредственного построения пути по входным параметрам: сначала запрашивается информация о доступном пользователю видеофайле и его субтитрах, после чего имя файла берётся из найденной записи, очищается через filepath.Base() и объединяется с директорией разрешённого видеофайла.
🐛 CVE-2026-17497, обнаруженная в NoteGen до версии 0.32.0, приводит к OS Command Injection. Проблема заключалась в том, что приложение по умолчанию разрешало Tauri-плагину shell запускать bash, python и python3 с произвольными аргументами, что позволяло злоумышленнику вызвать plugin:shell|execute и выполнить произвольные команды операционной системы с правами процесса NoteGen. В исправлении разработчики удалили из конфигурации разрешения на выполнение произвольных команд через Tauri Shell Plugin.
🐛 CVE-2026-47752, обнаруженная в Tugtainer до версии 1.30.2, приводит к Server-Side Template Injection (SSTI). Проблема заключалась в том, что поля title_template и body_template обрабатывались обычным окружением jinja2.Environment без изоляции опасных возможностей шаблонизатора, что позволяло авторизованному пользователю получить доступ к объектам Python и выполнить произвольные команды операционной системы с правами root внутри контейнера. В исправлении разработчики заменили jinja2.Environment на SandboxedEnvironment, ограничивающее доступ шаблонов к опасным атрибутам, методам и объектам Python.
🐛 CVE-2026-57531, обнаруженная в Milkdown до версии 7.21.3, приводит к Cross-site Scripting (XSS). Проблема заключалась в том, что обработчик parseDOM.getAttrs сохранял содержимое HTML-элемента span с атрибутом data-type="emoji" без очистки, а при последующей сериализации в Markdown это значение напрямую записывалось в innerHTML, что позволяло злоумышленнику внедрить вредоносный HTML- или JavaScript-код, который выполнялся при обработке вставленного содержимого. В исправлении разработчики добавили очистку HTML перед записью в DOM и исключили использование необработанного содержимого при сериализации.
🐛 CVE-2026-65919, обнаруженная в Meshery до версии 1.0.57, приводит к Path Traversal. Проблема заключалась в том, что эндпоинты /api/system/fileView и /api/system/fileDownload передавали полученный от пользователя параметр file напрямую в os.Open() без проверки пути, что позволяло злоумышленнику прочитать любой файл, доступный процессу Meshery. В исправлении разработчики добавили функцию SafeOpenFile(), которая разрешает чтение только из каталогов журналов ~/.meshery/logs, проверяет нахождение итогового пути внутри разрешённой директории и открывает файл через os.OpenRoot().+9
Спонсором сегодняшней задержки мемов просьба считать сети связи и их ТСПУ одной северной столицы 🫠
Всем классного (и правильного) завершения вечера и чудесных выходных 🤗
Repost from Positive Technologies
Контейнеры видите? Я разгрузил защитил. Теперь ваша очередь
Если вы любите контейнеры — даже когда они не отвечают вам взаимностью, — приходите 10–14 августа. Будет хакатон по runtime security, безопасности контейнеров и Kubernetes.
Берите толковых пацанов или девчонок. Не больше пятерых. Расследуйте события безопасности в кластерах. Придете один — тоже вариант. Соберем команду на месте.
На играх без правил — играйте без правил. С правилами — по правилам
Тема такая: сначала регистрация на Standoff 365. Сделайте это сейчас. Не завтра. Сейчас.
В начале — у всех все одинаково: найти нужное событие в Runtime Radar, понять контекст, накидать детектор. Но сложность выбираете сами, как в бою игре:
🟢 На изи — ищите событие стандартными фильтрами.
🟡 На нормале — добавьте аналитику, контекстный поиск и дополнительные атрибуты.
🟣На харде — создайте или измените политику мониторинга.
Для тех, кто не в теме: *Runtime Radar — наше опенсорсное решение для защиты контейнеров и мониторинга в реальном времени. Недавно рассказывали, как работает.Справитесь — шлите все нашим экспертам. Они проверят все. Вообще все. И выберут лучших. Кто победил — тот и победитель. Без вариантов Хакатонить можно где угодно. Под одеялом. В домике в лесу. В хипстерской кофейне. Стоя на двух грузовиках. Но финал — только в офисе Позитива. 14 августа соберем вас там на офлайн-тусовку. Расскажем, кто чего нарешал. Наградим победителей. И просто норм проведем время. Если участвуете — значит, вы участник. Можете выиграть лимитированный мерч и главный приз — цифровой мультитул Flipper Zero. Я сказал (с) Json S. @Positive_Technologies
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-45576, обнаруженная в zrok версий от 0.4.23 до 2.0.3, приводит к Path Traversal. Проблема заключалась в том, что команда
zrok2 copy принимала полученные из WebDAV или zrok Drive пути без надёжной проверки и передавала их в FilesystemTarget.WriteStream(), что позволяло выйти за пределы выбранной локальной директории и записать файл в другое место файловой системы. В исправлении разработчики добавили проверку и нормализацию виртуальных путей, а файловые операции перевели на os.OpenRoot(), ограничивающий создание и изменение файлов корневой директорией назначения.
🐛 CVE-2026-54498, обнаруженная в ViewComponent версий от 4.0.0 до 4.12.0, приводит к Cross-site Scripting (XSS). Проблема заключалась в том, что метод around_render мог вернуть небезопасную HTML-строку в обход экранирования, а ViewComponent::Collection#render_in объединял результаты компонентов через join() и безусловно помечал итоговую строку как безопасную с помощью html_safe, что позволяло злоумышленнику внедрить вредоносный HTML- или JavaScript-код, который выполнялся в браузере пользователя. В исправлении разработчики добавили повторную проверку и экранирование результата around_render, а объединение коллекций перевели на safe_join,.
🐛 CVE-2026-16124, обнаруженная в GoClaw до версии 3.15.0-beta.33, приводит к Server-Side Request Forgery (SSRF). Проблема заключалась в том, что защита компонента web_fetch не считала служебные диапазоны 198.18.0.0/15 и 240.0.0.0/4 запрещенными, что позволяло пользователю с доступом заставить сервер отправить запрос на адрес из этих подсетей и тем самым обойти фильтрацию. В исправлении разработчики добавили оба диапазона в списки запрещённых адресов, используемые функциями CheckSSRF и isPrivateIP.
🐛 CVE-2026-44342, обнаруженная в New API до версии 0.12.0-alpha.1, приводит к Cross-Site Request Forgery (CSRF). Проблема заключалась в том, что привязка адреса электронной почты и учётной записи WeChat выполнялась через GET-запросы к /api/oauth/email/bind и /api/oauth/wechat/bind, что позволяло злоумышленнику подготовить ссылку, при переходе по которой браузер авторизованного пользователя отправлял запрос с его сеансовыми файлами cookie и привязывал к аккаунту подконтрольный атакующему адрес или идентификатор WeChat. В исправлении разработчики заменили эти операции на POST-запросы и перенесли коды подтверждения из параметров URL в тело JSON-запроса.
🐛 CVE-2026-53963, обнаруженная в Discourse до версий 2026.1.5, 2026.4.2, 2026.5.1 и 2026.6.0, приводит к Cross-site Scripting (XSS). Проблема заключалась в том, что название второго фактора аутентификации, заданное пользователем, выводилось в диалоге подтверждения удаления без экранирования специальных символов, что позволяло злоумышленнику сохранить и выполнить вредоносный JavaScript-код. В исправлении разработчики добавили экранирование названия второго фактора перед его отображением в интерфейсе с помощью метода escapeExpression().+9
В славянском фольклоре пятница олицетворялась со святой Параскевой. В народе её часто называли Параскева-Пятница, и она считалась защитницей женщин, брака и домашнего очага.
Каким образом, при такой-то покровительнице, современная пятница обрела свою правильную часть — видимо уже навсегда останется загадкой для современных историков.
Но, как говорится, «было и было». Что ж теперь, обратно всё менять, в самом деле? 🤷♂️
Всем чудесного вечера! 🤗(и не забудьте поднять тосты за женщин, брак и домашний очаг, раз уж так вышло)
Repost from SecurityLab.ru
Коллеги, привет!
Мы изучаем, как сегодня DevSecOps-, AppSec- и ИБ-специалисты выстраивают процессы безопасности приложений: какие инструменты используют, как принимают решения, что действительно помогает в ежедневной работе, а что, наоборот, создает лишнюю нагрузку.
Если вы работаете с AppSec-инструментами - SAST, DAST, SCA и другими - нам очень важно узнать ваш реальный опыт и как процессы безопасной разработки устроены на практике: что удобно, какие задачи возникают чаще всего, какие сценарии автоматизации востребованы и как сегодня развивается AppSec в компаниях.
🕒 Опрос займет 3-5 минут.
Все ответы будут использоваться только в обобщенном виде для исследования пользовательских сценариев и развития продуктов.
Будем благодарны, если найдете несколько минут и поделитесь своим опытом.
Пройти опрос
🔍 Наиболее интересные уязвимости
🐛 CVE-2026-50133, обнаруженная в Hugo до версии 0.162.0, приводит к Cross-Site Scripting (XSS). Проблема заключалась в том, что содержимое файлов с типом
text/html без очистки переносилось в сформированную страницу, что позволяло при обработке HTML из недоверенного источника внедрить произвольный JavaScript-код. В исправлении разработчики запретили использование содержимого text/html по умолчанию и добавили проверку типа содержимого через настройку security.allowContent.
🐛 CVE-2026-42153, обнаруженная в Coolify до версии 4.0.0-beta.474, приводит к OS Command Injection. Проблема заключалась в том, что пользовательские значения postgres_user и postgres_db подставлялись в строковую команду проверки работоспособности PostgreSQL, выполняемую через командную оболочку, что позволяло аутентифицированному злоумышленнику внедрить и выполнить произвольные команды. В исправлении разработчики отказались от строковой команды CMD-SHELL и стали запускать psql через CMD с отдельным массивом аргументов.
🐛 CVE-2026-58468, выявленная в NocoBase до версии 2.1.20 включительно, приводит к Server-Side Request Forgery (SSRF). Проблема заключалась в возможности передать URL в узлах рабочих процессов, пользовательских действиях или модуле искусственного интеллекта без проверки значения адреса, что позволяло злоумышленнику заставить сервер обратиться к произвольным хостам. В исправлении разработчики добавили определение опасных адресов и запись предупреждений в журнал, а также расширили применение настройки SERVER_REQUEST_WHITELIST.
🐛 CVE-2026-59149, обнаруженная в Mockoon до версии 9.7.0, приводит к Path Traversal. Проблема заключалась в том, что принадлежность файла разрешённому каталогу проверялась через startsWith() без учёта границы имени директории, что позволяло неаутентифицированному злоумышленнику читать произвольные файлы. В исправлении разработчики заменили строковое сравнение на проверку относительного пути через path.relative(), запретили абсолютные пути и переходы к родительским каталогам, а также исключили использование корня файловой системы в качестве разрешённого каталога для динамически сформированных путей.
🐛 CVE-2026-59834, обнаруженная в SiYuan до версии 3.7.1, приводит к SQL Injection. Проблема заключалась в том, что значения путей, передаваемые в эндпоинт POST /api/search/fullTextSearchBlock, напрямую добавлялись в условия SQL-запроса без параметризации, что позволяло неаутентифицированному злоумышленнику выполнить произвольный SQL код. В исправлении разработчики заменили непосредственную подстановку пользовательских значений в SQL на параметризованные запросы, а также добавили функцию IsValidSearchBoxPath() для проверки корректности идентификаторов блокнотов и путей документов.Мечтают ли кодинг-агенты о пятницах?
Я спросил у своего. Полный ответ приведу в комментариях, но в одном он прав точно:
Для человека Пятница — это символ конца страданий, усталости и порога свободы.That's my boy 🫂 Шарит ведь, не по годам. Так что... всем поскорее завершить все страдания и переступить «порог свободы», так сказать 🍻
Repost from Искусство. Код... ИИ?
🧩 Принципы и паттерны безопасной разработки: DIP
Часть 4.
Принцип инверсии зависимостей (Dependency Inversion Principle, DIP) утверждает: модули верхнего уровня не должны зависеть от модулей нижнего уровня, оба должны зависеть от абстракций. При этом не абстракции должны зависеть от деталей, а детали — от абстракций.
С точки зрения безопасности, нарушение DIP означает, что высокоуровневая логика (принятие решений, обработка входных данных) жёстко привязана к конкретной низкоуровневой реализации. Когда эта реализация меняется или расширяет поверхность атаки — высокоуровневый модуль наследует проблему автоматически, без какого-либо контроля на своей стороне.
💡 Пример
// С нарушением DIP
class DataBinder {
void bind(Object target, Map<String,String> params) {
for (PropertyDescriptor pd :
Introspector.getBeanInfo(target.getClass())
.getPropertyDescriptors()) {
if (params.containsKey(pd.getName()))
pd.getWriteMethod().invoke(target, params.get(pd.getName()));
}
}
}
// С соблюдением DIP
interface BindablePropertyResolver {
List<BindableProperty> resolve(Class<?> type);
}
class DataBinder {
private final BindablePropertyResolver resolver;
void bind(Object target, Map<String,String> params) {
for (BindableProperty bp : resolver.resolve(target.getClass())) {
if (params.containsKey(bp.name()) && bp.isSafe())
bp.set(target, params.get(bp.name()));
}
}
}
Абстракция BindablePropertyResolver контролируется высокоуровневым модулем и определяет контракт: что можно связывать, а что — нет. Даже если интроспекция обнаружит новые свойства, они не станут доступны без явного разрешения.
Помимо архитектурного разделения, главным правилом остается биндинг входных данных строго к выделенным DTO (Data Transfer Objects), а не к доменным сущностям или объектам фреймворка. DTO содержит только явно разрешенные поля, что исключает динамический биндинг опасных свойств.
Нарушения DIP провоцируют:
• CWE-913: Improper Control of Dynamically-Managed Code Resources
• CWE-470: Use of Externally-Controlled Input to Select Classes or Code
• CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes
🐛 Жизненное
CVE-2022-22965 — Spring Framework RCE, она же Spring4Shell (CVSS 9.8).
Механизм привязки параметров (data binding) в Spring MVC — высокоуровневый модуль, отвечающий за маппинг HTTP-параметров в свойства Java-объектов. Внутри он напрямую зависит от низкоуровневого Java Beans Introspection API (CachedIntrospectionResults → java.beans.Introspector), рекурсивно обходящего цепочки геттеров/сеттеров.
На JDK 8 существовал чёрный список: Spring блокировал доступ к class.classLoader. Но в JDK 9 у Class появился новый геттер — getModule(). Через него открылся обходной путь class.module.classLoader, не попавший в чёрный список. Цепочка:
class.module.classLoader.resources.context.parent.pipeline.first.*
позволяла модифицировать конфигурацию Tomcat AccessLogValve — атакующий менял путь, паттерн и суффикс лога, записывая на диск JSP-файл (web shell).
Нарушение DIP здесь в том, что data binding напрямую зависел от конкретного механизма интроспекции (низкоуровневая деталь), без абстракции, определяющей контракт: какие свойства разрешено связывать. Когда деталь (набор доступных PropertyDescriptor-ов) изменилась из-за развития JDK — поверхность атаки расширилась без единого изменения в коде самого Spring.
🔧 Как пофиксили
Spring не стал внедрять глобальный белый список (чтобы не сломать обратную совместимость), и добавил чёрный, на уровне интроспекции. Доступ к свойствам Class, classLoader и protectionDomain был полностью заблокирован, что разорвало опасную цепочку... до следующего витка развития JDK, видимо 😬
💻 Как насчет композиционных языков?
Оставим это на правах домашнего задания: подумать, как Rust поощряет DIP через трейты, а Go — делая упор на простоту, снижение шаблонного кода и неявные интерфейсы.
⚠ TL;DR: Если модуль верхнего уровня напрямую зависит от деталей реализации нижнего — любое изменение внизу может молча расширить поверхность атаки наверху. Инвертируйте зависимость: пусть высокоуровневый модуль определяет контракт допустимых данных, а низкоуровневый — реализует его. А на входе всегда используйте DTO.