我有以下代码:
def download_package(self, dist_dir):
safe_list = ["prod","staging"]
prod_dir = 'prod'
staging_dir = 'staging'
kp_dir = os.path.join(dist_dir, 'key_protect')
for dir_name in [prod_dir, staging_dir]:
try:
if dir_name in safe_list:
my_dir = os.path.join(kp_dir, dir_name)
os.makedirs(my_dir)
except OSError, e:
if e.errno == os.errno.EEXIST:
print("Target directories exist %s" % my_dir)
当我使用HCL应用程序扫描此代码时,它能否指出我在第my_dir = os.path.join(kp_dir, dir_name)
行出现问题,而在kp_dir = os.path.join(dist_dir, 'key_protect')
上未检测到问题,就安全性而言,我不确定该代码中存在什么问题。扫描表明此代码受到路径遍历攻击。有人可以帮忙吗?
答案 0 :(得分:0)
我不确定HCL应用程序如何工作,但是问题是由于该函数接受一个dist_dir
参数,该参数随后用于发出副作用产生命令(即os.makedirs()
) 。
有关此类攻击的更多信息,请参见Wikipedia entry。
很有可能,此问题仅由第二次os.path.join()
触发,因为第二次os.makedirs()
调用(而不是第一次)的结果调用了os.path.join()
。
为防止该漏洞,您应清除dist_dir
的内容。
例如,您可能会做类似的事情:
def download_package(self, dist_dir):
if '../' not in dist_dir and '/..' not in dist_dir and '..' != dist_dir:
prod_dir = 'prod'
staging_dir = 'staging'
kp_dir = os.path.join(dist_dir, 'key_protect')
for dir_name in [prod_dir, staging_dir]:
try:
my_dir = os.path.join(kp_dir, dir_name)
os.makedirs(my_dir)
except OSError, e:
if e.errno == os.errno.EEXIST:
print("Target directories exist %s" % my_dir)