如何解决“问题”;命令注入“;由Checkmarx针对python代码发布;args=parser.parse_args()“;?

如何解决“问题”;命令注入“;由Checkmarx针对python代码发布;args=parser.parse_args()“;?,python,checkmarx,secure-coding,sast,commandinjection,Python,Checkmarx,Secure Coding,Sast,Commandinjection,我有一个python代码,它解析输入参数,如下所示: parser=argparse.ArgumentParser(description='Information injection in file.')#,usage=usage() requiredName=解析器。添加参数组(“…”) requiredNamed.add_参数('--name',action='store',dest='myname',help='…',required=True) requiredNamed.add_参数

我有一个python代码,它解析输入参数,如下所示:

parser=argparse.ArgumentParser(description='Information injection in file.')#,usage=usage()
requiredName=解析器。添加参数组(“…”)
requiredNamed.add_参数('--name',action='store',dest='myname',help='…',required=True)
requiredNamed.add_参数('--type',action='store',dest='mytype',help='…',required=True)
parser.add_参数('--enums',nargs='+',help='List to include')
args=parser.parse_args()
对于上述代码,Checkmarx显示了“args=parser.parse_args()”的高严重性错误消息,如下所示:

应用程序的get_process_output方法使用Popen调用OS(shell)命令,并使用不受信任的字符串执行该命令。 这可能允许攻击者注入任意命令,并启用命令注入攻击。 攻击者可以通过用户输入parse_args注入已执行的命令,该命令由应用程序在{}方法中检索


上面的python代码是在内部使用的(不是在像web站点这样的公共环境中),因此不会发生命令注入。所以在本例中,为了通过Checkmarx扫描,您能告诉我更新python代码的任何线索吗?(例如,是否有其他python API可用于替换上述“args=parser.parse_args()”?谢谢!

您没有正确考虑这个问题。问题不在于
parse_args
调用。问题在于调用
subprocess.Popen
,它正在启动一个来自这些参数的命令,而没有过滤字符串以删除危险部分。我们无法从这个小片段中看到需要哪些信息您正在传递,但解决方案是过滤传递给
Popen
的命令,这样它就不会启动讨厌的命令。例如,删除
|
&
&
子句。我的意思是过滤用户的字符串以删除这些子句。如果您的命令需要它们,没关系。@TimRoberts最好是给
Popen
一个列表而不是字符串,这样可以避免shell解释。例如,假设您的一个参数是文件名,您创建了一个命令行
“grep xyz”+filename
并将其传递给Popen。简单。但是如果用户提供的文件名为
/dev/zero | rm-rf~/*
,您的代码将删除您的所有文件。非常感谢您的快速回答!好的,我会在“subprocess.Popen”之前添加过滤器谢谢Timrobts和hobbs的帮助!