【问题标题】:Non literal import Untrusted user input in importlib.import_module() Warning非文字导入 importlib.import_module() 中不受信任的用户输入警告
【发布时间】:2021-10-31 21:47:01
【问题描述】:

通过 Semgrep(静态代码验证器)运行我的 python 代码时,我收到以下警告。 请提出任何实际示例如何使用白名单来防止运行不受信任的代码或任何其他解决方案来避免此警告。我在网上搜索但找不到任何示例..

我在 import_module 的特定行下方收到警告

警告: importlib.import_module() 函数中不受信任的用户输入允许攻击者加载任意代码。避免 importlib.import_module() 中的动态值或使用白名单来防止运行不受信任的代码。

channel_module = import_module("src.main.core_prj.prj_" + config['subscription'].lower())

【问题讨论】:

  • 您收到此警告是因为动态导入这样的模块存在真正的安全风险。你可以用一些答案here 来压制警告,但我建议重新考虑这段代码(如果可能的话)
  • 感谢@OferSadan

标签: python python-3.x python-import whitelist semgrep


【解决方案1】:

触发规则可以在https://semgrep.dev/r?q=Untrusted+user+input+in+importlib.import_module 找到。单击规则将展开以显示定义,这表明它允许 importlib.import_module("..") 并在使用变量时触发警告。

规则提到它打算阻止CWE-706: Use of Incorrectly-Resolved Name or Reference,这是相当广泛的。

这与示例代码无关,它在用户定义的配置字符串之前有一个字符串前缀,因此import_module("src.main.core_prj.prj_" + config['subscription'].lower()) 不可能加载预期控制范围之外的模块(资源)(@ 987654326@).

要指示 semgrep 忽略该行,请附加内联注释 nosem,如 Python 的以下内容

>>> channel_module = importlib.import_module("src.main.core_prj.prj_" + config['subscription'].lower())  # nosem

https://semgrep.dev/s/KXZL 的 semgrep 规则游乐场中测试上述内容

在添加这些内联 cmets 禁用行或行上的特定规则后,可以使用 --strict 命令行参数再次显示它们。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2019-10-24
    • 2020-08-27
    • 1970-01-01
    • 2023-03-14
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多