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_exps_arg_string (input_exps_str): input_dict = {} for input_raw in filter(bool, input_exps_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。
