为什么要理会 argv[0]?

主要观点:命令行存在问题,argv[0]通常被保留用于表示进程名,但这会引发安全等问题。
关键信息:

  • argv[0]是过去的遗留产物,不同操作系统对其处理方式不同,如 Windows 自身 API 不允许手动设置argv[0],但因采用 POSIX exec调用仍有办法手动设置。
  • 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]能让新进程知晓调用进程的请求。
  • shutdownreboot为例,在不同系统中它们与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]滥用的检测。
阅读 11
0 条评论