printf - python 用户输入 - java printf

printf(user_input) 仍然很危险:我如何用格式破坏构建

什么是格式字符串错误?

当未经验证的 Python 用户输入被传递到格式化函数时,就会发生格式字符串错误,例如 printf,System.out.printf或 Python 的 f 字符串和日志记录方法。这些函数解释格式说明符(例如 %s,%x字符串中包含 ( 等)。如果字符串处于用户控制之下,则可能会导致崩溃或安全问题。

所以当我们说 printf(用户输入),我们警告不要让不受信任的 Python 用户输入控制强大的格式化程序。

真实世界设置:Python 应用程序中的 printf(user_input)

开发人员添加了一个看似无害的调试语句,使用 printf(用户输入) 在 Python 脚本中。 commit 通过代码审查并被 CI 采纳 pipeline。在执行期间,格式化程序遇到了带有意外标记的 Python 用户输入,导致输出损坏和构建失败。

CI 日志(摘录):

TypeError:预期格式...得到... 没有恶意输入,只是格式假设出错了。因为 printf 解释的是结构, pipeline 因看似例行的输入而崩溃。

显而易见的陷阱:为什么 printf(user_input) 在 2025 年仍然存在

尽管格式化字符串漏洞可以追溯到 C 语言,但它们至今仍是一个问题。快节奏的开发通常涉及从 Stack Overflow 或内部工具复制代码。例如, printf(用户输入) or 打印(f”{user_input}”) 看似无害,但事实并非如此。

即使是现代 CVEs 展示现实世界的后果。采取 CVE-2023-21930 例如:广泛使用的 Java printf 实现中存在一个格式字符串漏洞,攻击者可以利用该漏洞导致应用程序崩溃或读取敏感内存。或者 CVE-2023-36052,影响日志系统,其中用户控制的格式字符串导致日志损坏。

这些不是边缘问题;它们影响现代的、积极维护的图书馆和系统。 诸如 f 字符串和模板字面量之类的现代语言特性简化了格式化,但也隐藏了复杂性。如果使用不当,它们可能会导致服务崩溃或逻辑泄露。

这些漏洞不仅存在于旧版应用程序中。我们在开源 CI 脚本、初始化日志,甚至使用 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. 开发 commit代码与 printf(用户输入)
  2. CI 作业运行,处理用户控制的输入
  3. 格式化程序错误解释字符串 → 崩溃或输出损坏
  4. 构建失败,延迟部署并增加调试时间

这不是理论;我们已经看到它在现代环境中发挥作用。

不仅仅是遗留问题:为什么格式错误至今仍然重要

格式字符串错误并不是遗留问题;它们已经进化了。 Python、Java 和 Node.js 都支持富文本格式化工具。而现代开发习惯往往意味着 Python 用户的输入会不加检查地流入这些工具中。

为什么它仍然会发生?速度。直觉。初级开发人员可能会写 打印(f”{user_input}”) 无需思考。 System.out.printf(用户输入) 在Java中。

CVE 持续涌现。最近的安全公告强调了现代生态系统中存在的格式字符串问题。CVE-2023-21930(Java printf)和 CVE-2023-36052(日志框架)等漏洞表明,在当代环境中,未经验证的格式字符串仍然可能导致崩溃或数据泄露。

CI/CD 光靠检查是不够的。CI 通常会检查语法和 lint 规则,但不会检查不安全的格式字符串。这留下了一个关键的漏洞。

发现地雷:格式字符串问题的现代检测

这些错误很容易编写但很难检测。

你的 IDE 可能不会拯救你: VS Code、PyCharm、IntelliJ 虽然在处理许多错误方面表现出色,但它们通常不会跟踪输入源和格式化函数之间的数据流。删除 printf(user_input) 或 System.out.printf(用户输入) 进入您的代码不会引发警报,因为 IDE 假设您可以控制正在格式化的字符串。

Linters 也无法捕捉到它。 流行的 linters 工具(例如 flake8、pylint 或 eslint)专注于语法、样式和常规错误。除非进行特殊配置,否则它们无法理解这些 用户输入 可能来自外部或不受信任的来源。GitHub Action 正在运行 standard 即使您引入了危险的格式字符串,lint 规则也可能会给您一个绿色复选标记。

其中 SAST 进来: 静态应用程序安全测试(SAST) 非常适合解决这个问题,因为它遵循代码库中的数据流。一个好的 SAST 工具 能够:

  • 跟踪来自不受信任来源的数据(例如,Python 用户输入、环境变量、CLI 参数)
  • 确定数据何时流入敏感接收器(例如格式化函数) (printf、System.out.printf、f 字符串)
  • 标记不安全的路径并生成可操作的警报,即使危险的路径隐藏在辅助方法或包装类中
  • 支持自定义规则或策略进行阻断 printf(用户输入)类似规模的模式

SAST 有助于左移:它可以在开发或 CI 期间捕获格式错误,以免它们导致运行时问题或安全事件。

TL博士: Guardrails > 手动审查快速行动的团队需要 SAST 充当安全网,了解上下文,跟踪输入流,并在合并之前阻止危险的格式。

Guardrails 有效方法:防止格式驱动的故障

从 CI 中的静态检查开始 使用以下工具:

  • 分析从输入到格式化程序的数据流
  • 不安全情况下的区块合并 的printf 使用
  • 添加 pre-commit hooks 用于格式字符串模式

停止使用 Raw printf(用户输入) 使用更安全的模式:

在Python中

logging.info("%s", user_input)  # Safe
Avoid:
print(f"{user_input}")  # Risky

在 Java 中

MessageFormat.format("{0}", userInput)  // Safe
Or sanitize inputs if using System.out.printf.

包装格式逻辑: 创建内部包装器:

  • 拒绝不受信任的格式字符串
  • 使用模板记录
  • 可测试和可审计

不要依赖文化,要使其自动化。 培训你的团队,但要通过 CI 执行来支持它, SAST.

DevSecOps 实战:Xygeni 如何在部署前阻止格式错误

在重要的地方捕获格式错误:在 CI 中, 西吉尼 主动扫描存储库以查找危险的格式模式,例如:

  • printf(用户输入) 在 Python 中
  • System.out.printf(用户输入) 在Java中

这些被标记为高风险,因为它们允许 Python 用户输入和 Java printf 滥用来定义格式化引擎中的行为。

跨 CI 提供商的实时阻止。 与 GitHub Actions 集成时,GitLab CI/CD、Bitbucket Pipelines 或 Jenkins 上线后,Xygeni 会在代码上线前停止合并。开发人员会立即收到一条上下文警报,显示以下内容:

  • 漏洞出现的确切文件和行
  • 对问题的清晰解释(例如,“格式字符串中的输入未经验证”)
  • 建议采取补救措施

这种早期阻断机制将 Xygeni 从报告工具转变为合并守门人。与事后警报或模糊的发现不同,您可以在关键时刻获得可执行的安全规则。

上下文感知扫描: 与关键字搜索不同,Xygeni 会分析数据流,以了解格式字符串是否源自 Python 用户输入。它可以区分安全的内部字符串和携带外部数据的字符串。

为何如此重要: 开发人员不需要更多噪音。他们需要智能、可操作的工具。Xygeni 提供预先cis电子检测并执行实时 guardrails 在您的 CI 中,它们很重要 pipeline。 一探究竟!

TL;DR – 小错误,大混乱:不要 printf(用户输入)

这一行可以:

  • 中断 CI
  • 损坏的日志
  • 导致运行时异常

并且这种现象在 2025 年仍会出现。

真正的风险

风险 为什么会发生 如何解决它
CI 构建和日志中断 格式标记会破坏输出 避免直接 printf(user_input)
现代堆栈仍然很脆弱 Java/Python 中格式调用的误用 净化输入或使用更安全的 API
IDE 和 linters 忽略了这一点 他们不跟踪数据流 绝大部分储备使用 SAST 工具
危险代码被合并 评论可能会忽略格式缺陷 在 CI 中使用 Xygeni 等工具

开发人员检查清单

  • 不要将用户输入直接传递到格式字符串中
  • 净化或转义用户输入
  • 使用安全方法:
    • Python: logging.info(“%s”,用户输入)
    • Java的: 消息格式.format()
  • 使用 SAST 理解输入流的工具
  • 执行 guardrails 在CI中

一锤定音: 这不是妄想,而是做好准备。格式错误很容易出现,如果忽视,后果将不堪设想。务必在错误出现之前就将其阻止。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件