主要观点:命令行存在问题,argv[0]
通常被保留用于表示进程名,但这会引发安全等问题。
关键信息:
argv[0]
是过去的遗留产物,不同操作系统对其处理方式不同,如 Windows 自身 API 不允许手动设置argv[0]
,但因采用 POSIXexec
调用仍有办法手动设置。argv[0]
大多被忽略,调用exec
时前两个条件由操作系统处理,最后关于argv[0]
的条件可被忽略,多数程序会忽略argv[0]
的值。argv[0]
可破坏防御,能愚弄安全软件,如 Windows 的 Defender 检测逻辑在argv[0]
设置为空格等情况下会失效,还可通过在argv[0]
中添加调优关键字绕过检测。argv[0]
可欺骗,可通过操纵argv[0]
使人类误判,如在curl
命令中改变argv[0]
的值来改变命令的含义,还可利用 Right-To-Left Override 字符欺骗分析师。argv[0]
可损坏遥测数据,将足够多字符填入argv[0]
可将其他参数推至命令行末尾,导致监控软件截断相关参数,使检测逻辑和分析师无法得知实际情况。
重要细节:- 在 POSIX 系统中,应用可被 symlinked,
argv[0]
能让新进程知晓调用进程的请求。 - 以
shutdown
和reboot
为例,在不同系统中它们与systemctl
的关系不同,说明argv[0]
的设计可能导致程序行为不同。 - 从不同角度讨论了
argv[0]
设计的合理性,如从 2020 年代的观点看不可取,从 1970/1980 年代看可减少重复冗余。 - 展示了多种编程语言中操纵
argv[0]
的方法,如 Python、Perl、Ruby 和 Bash。 - 提到 Windows 7 中命令行最大长度为 32,727 字符,Linux 内核中为 131,072 字符,macOS Sonoma 中为 1,048,576 字符。
- 建议软件开发者不要依赖
argv[0]
,安全专业人员要提高对argv[0]
的认识并自动检测相关绕过行为,防御软件应改进对argv[0]
滥用的检测。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。