printf - потребителски вход в Python - Java printf

printf(user_input) все още е опасно: Как счупих компилация с формат

Какво представляват грешките във форматните низове?

Грешки във форматните низове възникват, когато невалидиран потребителски вход от Python се предава във функции за форматиране като printf, System.out.printfили f-низовете и методите за регистриране на Python. Тези функции интерпретират спецификатори на формат (като %s, %xи т.н.) в низа. Ако низът е под контрола на потребителя, това може да доведе до сривове или проблеми със сигурността.

Така че, когато казваме printf(потребителски_вход), предупреждаваме да не се дава контрол върху мощните форматиращи инструменти на ненадежден потребител на Python.

Настройка от реалния свят: printf(user_input) в Python приложение

Разработчик добави на пръв поглед безобиден дебъг оператор, използвайки printf(потребителски_вход) вътре в Python скрипт. Това commit преминал преглед на кода и бил избран от CI pipelineПо време на изпълнение, форматиращият инструмент е срещнал потребителски вход в Python с неочаквани токени, което е довело до повреден изход и неуспех при компилиране.

CI дневник (откъс):

Грешка в типа: очакван формат… получено… Няма злонамерен вход, просто грешно предположение за форматиране. Тъй като printf интерпретира структурата, pipeline се срина при нещо, което изглеждаше като рутинно въвеждане.

Капанът на пръв поглед: Защо printf(user_input) все още се случва през 2025 г.

Въпреки уязвимостите във форматните низове, датиращи от C, те остават проблем и днес. Бързото разработване често включва копиране на фрагменти от Stack Overflow или вътрешни инструменти. Ред като printf(потребителскиВход) or печат(f”{потребителски_вход}") изглежда безобидно, но не е.

Дори модерните CVE покажете реални последици. Вземете CVE-2023 21930- като пример: уязвимост във форматен низ в широко използвана имплементация на Java printf позволява на атакуващите да причиняват сривове на приложения или да четат чувствителна памет. Или CVE-2023 36052-, засягайки система за регистриране, където контролираните от потребителя форматиращи низове водеха до повреда на регистрационните файлове.

Това не са крайни случаи; те засягат съвременни, активно поддържани библиотеки и системи. Съвременните езикови функции, като f-низове и шаблонни литерали, улесняват форматирането, но също така скриват сложността. Използвани небрежно, те могат да сринат услугите или да разкрият логиката.

Тези грешки не съществуват само в наследени приложения. Виждали сме ги в CI скриптове с отворен код, init лог файлове и дори инструменти за сигурност, изградени със съвременни стекове като Python, Java printf и Node.js.

В крайна сметка: printf(потребителски_вход) не е просто лош стил, това е реален риск.

Анатомия на уязвимостта: Какво прави printf(user_input)

По номинална стойност, printf(потребителски_вход) просто отпечатва низ. Но „под капака“ го интерпретира като поредица от инструкции.

В Python, Java и Node.js моделът е един и същ: функциите за форматиране анализират входните данни за токени като %s, %x или {}Ако входният низ идва от потребителя и не е валидиран, тези токени действат като команди. Това може да доведе до сривове, повредени лог файлове или проблеми със сигурността.

Още по-лошо е, че много библиотеки и обвивки абстрахират стъпката на форматиране, така че уязвимостта може да бъде скрита дълбоко в помощни функции или инструменти за регистриране. Може да си мислите, че просто регистрирате текст, но ненадеждни токени от потребителски вход в Python или Java printf могат тихомълком да повредят приложението ви.

Таксата: Функциите за форматиране не са само за изход; те интерпретират структура. Ако позволите на потребителския вход да дефинира тази структура, рискувате нестабилност и компрометиране.

Реален риск в PipelineОт Инокентий Commit да се изгради прекъсване на работата

Започва с малко commit: лог отчет, използващ printf(потребителски_вход).

CI приема промяната, изпълнява я и бум, лог файловете са повредени, изходът е неправилно подравнен, тестовете са нечетливи. Само един невалидиран потребителски вход в Python с форматиращи токени беше достатъчен, за да свие системата. pipeline.

CI/CD поток:

  1. Дев commits код с printf(потребителски_вход)
  2. CI задачата се изпълнява, обработвайки контролиран от потребителя вход
  3. Форматиращият програматор интерпретира неправилно низа → срив или повреден изход
  4. Неуспешно изграждане, забавяне на внедряването и увеличаване на времето за отстраняване на грешки

Това не е теория; видяхме го да се разиграва в съвременни условия.

Не само наследство: Защо грешките във форматите все още имат значение днес

Грешките във форматните низове не са реликви; те са еволюирали. Python, Java и Node.js поддържат инструменти за богато форматиране. А съвременните навици за разработка често означават, че потребителският вход на Python постъпва неконтролирано в тези инструменти.

Защо все още се случва Скорост. Интуиция. Младши разработчик може да напише печат(f”{потребителски_вход}") без да се замисля. Същото важи и за System.out.printf(потребителски вход) на Java.

CVE продължават да се появяват. Последните предупреждения за сигурност подчертават проблеми с форматните низове в съвременните екосистеми. Уязвимости като CVE-2023-21930 (Java printf) и CVE-2023-36052 (фреймуърк за регистриране) показват как невалидираните форматни низове в съвременни среди все още могат да доведат до сривове или изтичане на данни.

CI/CD Само по себе си не е достатъчно. CI често проверява синтаксиса и правилата за lint, но не и използването на опасни форматиращи низове. Това оставя критична празнина.

Откриване на противопехотни мини: Съвременно откриване на проблеми с форматните низове

Тези грешки са лесни за писане и трудни за откриване.

Вашата IDE вероятно няма да ви спаси: VS Code, PyCharm, IntelliJ, макар и чудесни за много грешки, те обикновено не проследяват потока от данни между входните източници и функциите за форматиране. printf(потребителски_вход) или System.out.printf(потребителски вход) във вашия код няма да предизвика аларми, защото IDE-тата предполагат, че вие ​​контролирате форматирания низ.

Линтърите също не го хващат. Популярни линтери като flake8, pylint или eslint се фокусират върху синтаксиса, стилизирането и конвенционалните грешки. Освен ако не са специално конфигурирани, те няма да разберат това. потребителски_вход може да идва от външен или ненадежден източник. Изпълнява се действие в GitHub standard Правилата за lint вероятно ще ви дадат зелена отметка, дори ако сте въвели опасен форматиращ низ.

Къде SAST Влиза: Статично тестване на сигурността на приложенията (SAST) е уникално подходящ за този проблем, защото следва потока от данни през вашата кодова база. Един добър SAST инструмент мога:

  • Проследяване на данни от ненадеждни източници (напр. потребителски вход в Python, променливи на средата, аргументи на CLI)
  • Идентифицирайте кога тези данни се вливат в чувствителни приемници, като например функции за форматиране. (printf, System.out.printf, f-низове)
  • Маркирайте опасни пътища и генерирайте предупреждения, с които да се предприемат действия, дори ако рисковият ред е скрит в помощен метод или обвиващ клас
  • Поддържайте персонализирани правила или политики за блокиране printf(потребителски_вход)-подобни модели в мащаб

SAST помага за изместване наляво: то улавя грешки във формата по време на разработка или непрекъсваема интеграция, преди те да могат да причинят проблеми по време на изпълнение или инциденти със сигурността.

TL; DR: Guardrails > Ръчен преглед Бързо развиващите се екипи се нуждаят SAST да действа като предпазна мрежа, която разбира контекста, следва входния поток и блокира опасното форматиране преди сливане.

Guardrails Това работи: Предотвратяване на грешки, причинени от форматиране

Започнете със статични проверки в CI Използвайте инструменти, които:

  • Анализирайте потока от данни от входа до форматиращия механизъм
  • Блокиране на сливания при опасно ФОРМАТ употреба
  • Добави pre-commit hooks за шаблони за форматиране на низове

Спрете да използвате сурови продукти printf(потребителски_вход) Използвайте по-безопасни модели:

В Пайтън

В Ява

Увийте логиката на формата си: Създайте вътрешни обвивки, които:

  • Отхвърляне на ненадеждни форматиращи низове
  • Дневник с шаблони
  • Подлежат на проверка и одит

Не разчитайте на културата, автоматизирайте я. Обучете екипа си, но го подкрепете с прилагане на CI и SAST.

DevSecOps в действие: Как Xygeni спира грешки във форматирането, преди да бъдат внедрени

Грешки във форматирането, открити там, където е важно: в непрекъснатата интеграция (CI), Ксигени активно сканира хранилищата за опасни модели на форматиране, като например:

  • printf(потребителски_вход) в Python
  • System.out.printf(потребителски вход) в Java

Те са маркирани като високорискови, защото позволяват въвеждането от потребителя на Python и злоупотребата с Java printf да дефинират поведение във форматиращите механизми.

Блокиране в реално време между доставчици на CI. Когато е интегриран с GitHub Actions, GitLab CI/CD, Битбукет Pipelines или Jenkins, Xygeni спира сливането, преди кодът да може да бъде пуснат онлайн. Разработчикът получава незабавно контекстуално предупреждение, показващо:

  • Точният файл и ред, където се появява уязвимостта
  • Ясно обяснение на проблема (напр. „невалидно въвеждане във форматиран низ“)
  • Препоръчителни действия за отстраняването му

Това ранно блокиране превръща Xygeni от инструмент за отчитане в контролер на сливания. Вместо последващи предупреждения или неясни констатации, получавате приложими правила за сигурност в момента, в който е най-важно.

Контекстно-зависимо сканиране: За разлика от търсенията по ключови думи, Xygeni анализира потока от данни, за да разбере дали форматните низове произхождат от потребителски вход в Python. Той може да прави разлика между безопасни вътрешни низове и такива, които носят външни данни.

Защо това има значение: Разработчиците не се нуждаят от повече шум. Те се нуждаят от интелигентни, практични инструменти. Xygeni предлага предварителноcisелектронно откриване и налага работа в реално време guardrails където имат значение, във вашата CI pipeline. Виж това!

TL;DR – Малка грешка, голяма бъркотия: Не го правете printf(потребителски_вход)

Този един ред може:

  • Прекъсване на CI
  • Повредени лог файлове
  • Причина за изключения по време на изпълнение

И все още се появява през 2025 г.

Реалните рискове

Риск Защо се случва Как да го поправите
CI компилациите и лог файловете се счупват Форматните токени нарушават изхода Избягвайте директни printf(user_input)
Съвременните стекове все още са уязвими Злоупотребени форматиращи извиквания в Java/Python Дезинфекцирайте входните данни или използвайте по-безопасни API-та
IDE и linter-ите го пропускат Те не проследяват потока от данни употреба SAST инструментите
Опасен код се слива Рецензиите могат да пропуснат недостатъци на формата Използвайте инструменти като Xygeni в CI

Контролен списък за разработчици

  • Не предавайте потребителски вход директно във форматиращи низове
  • Почистване или избягване на потребителски вход
  • Използвайте безопасни методи:
    • питон: logging.info("%s", потребителски_вход)
    • Java: MessageFormat.format()
  • Употреба SAST инструмент, който разбира входния поток
  • Налагане guardrails в CI

Final Word: Не става въпрос за параноя; става въпрос за подготвеност. Грешките във форматирането са лесни за въвеждане и са вредни, ако бъдат пренебрегнати. Спрете ги, преди да се появят.

инструменти за анализ на състава на софтуера SCA Tools
Приоритизирайте, отстранете и защитете софтуерните си рискове
Вземете своя безплатен акаунт.
Не е необходима кредитна карта.

Осигурете си разработка и доставка на софтуер

с продуктовия пакет Xygeni