114、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(下)
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(上)
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(中)
分析了带转义字符的文件名,以及 ANSI-C 引用语法,还有 ANSI-C,ASCII 与转义规则之间的关系,下面延伸下 -print0 的另一个话题:安全
-print0 补充
首先回到之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 选项
的思路,分析了命令
find ~/.vscode-server -path "*/swyddfa.esbonio/sphinx/html" -type d -print0 2>/dev/null
加上 -print0 可以把所有的文件路径都安全地找出来(用 \0 分隔),下面举个例子看下安全和不安全的处理方法
接之前的 blog
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(上)
假设现在 Bash 环境上已经创建了两个文件
下面在终端中输入处理的安全模式,来看下效果
find . -name "*test*" -print0 | while IFS= read -r -d '' file; doecho "Processing: $file"
done
输出结果如下
可以看到:
- 含换行符的文件 ‘./test‘$’\n’‘test.txt’ 被当作一个完整的文件名处理
- 换行符 \n 是文件名的一部分,所以 echo 处理输出时也换行了,但换行后的内容并没有被单独处理(换行后的内容没有被 Processing)
- 这就是安全的处理行为:不拆分,不丢失,完整处理
下面再对比下不安全的处理模式,终端中输入
find . -name "*test*" -print | while IFS= read -r file; doecho "Processing: $file"
done
输出结果如下
可以看到:
- find -print 用换行符 \n 分隔文件名,但文件名 ‘./test‘$’\n’‘test.txt’ 本身包含换行符 \n
- 此时 read 把这个异类当成了两个文件:./test,test.txt 处理(都有 Processing),导致一个文件被拆成两个,解析错误
安全漏洞
上面举的例子还都是 echo “Processing: $file” 等打印任务,没什么攻击性,最多处理任务失败,但并不是所有的处理都这么温和没有伤害性,如果有些处理比较激进,但又缺乏安全考虑,可能就会遭受到攻击
实际上,这些文件名中的特殊字符(如空格、换行符、制表符、- 开头等)也是 Shell 脚本中最常见,最隐蔽的安全漏洞来源,下面调整一下上面的不安全处理模式,加上危险操作
find . -name "*test*" -print | while IFS= read -r file; doecho "Processing: $file"rm "$file"
done
此时模拟黑客,创建一个恶意文件名混在正常的文件当中
touch test1.txt test2.txt $'test\nimportant.txt' important.txt
看看会发生什么,在执行命令前,先看下文件夹下内容
创建了 test1.txt,test2.txt,important.txt,并包含了恶意文件 $‘test\nimportant.txt’
上面经过调整的不安全处理脚本,本意是找到 test 相关的文件,给它删掉
但执行后,可以看到重要文件 important.txt 也被删掉了!只剩下恶意文件
现在换上安全的处理模式,同样执行相同的命令:将 test 相关的文件找到,并删除
find . -name "*test*" -print0 | while IFS= read -r -d '' file; doecho "Processing: $file"rm "$file"
done
可以看到恶意文件被删掉了,但重要文件 important.txt 还在!
所以最后总结下,使用 -print0 不仅能避免处理失败,还可以预防恶意攻击,在编程的时候,还是要多注意防御式编程,写出安全,鲁棒性好的可靠代码!
-print0 先分析到这儿,后面继续分析呈现方案脚本