TensorFlow Python代码注入:更多eval()问题

背景
JFrog安全研究团队(以前的Vdoo)最近披露了随附的一个实用程序中的代码注入问题TensorFlow这是一个在业界广泛使用的热门机器学习平台。这个问题已被分配给cve - 2021 - 41228.
阅读更多关于我们之前在Yamale的类似披露博客.
注射问题
问题在于saved_model_cli工具,用于保存模型的状态。
攻击者可以控制——input_examples参数,可以提供任意运行的恶意输入Python代码.
根本问题在于preprocess_input_examples_arg_string功能:
Def preprocess_input_examples_arg_string(input_examples_str): input_dict = preprocess_input_exprs_arg_string(input_examples_str)…
这电话preprocess_input_exprs_arg_string,其中包含易受攻击的呼叫:
Def preprocess_input_exprs_arg_string(input_exprs_str): input_dict = {} for input_raw in filter(bool, input_exprs_str.split(';')):…Input_key, expr = input_raw。Split ('=', 1) # ast.literal_eval不适用于numpy表达式input_dict[input_key] =eval (expr) # pylint: disable=eval-used return input_dict
在我们的例子中,input_exprs_str是来自命令行参数的用户输入。
我们可以看到任意输入流向eval,这会导致代码注入。
自——input_examples选项只接受一个字典列表,最终用户没有预料到(供应商也没有记录)任意输入会导致代码注入。
TensorFlow的修复
这个问题被解决了TensorFlow 2.7.0,我们敦促任何使用saved_model_cli升级到此版本的工具。
自——input_examples选项应该只接受字典列表,eval调用被替换为对json.loads,它接受字典列表,并且可以安全地用于任意未过滤的输入。
我们能远程利用它吗?
正如我们在上一篇博文中提到的,这些问题可能被远程利用(在合理的情况下)参数注入攻击。更多细节请看我们之前的博文.
致谢
我们要感谢TensorFlow的维护者,他们及时验证和修复了这个问题,并在修复版本可用后负责任地为这个问题创建了一个CVE。