IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:File Descriptor

共 2 篇相关文章

IT 累计浏览 1,941

如何hook一个系统调用

这篇讲的是如何通过hook系统调用来定位一个隐蔽的bug。作者从一个具体问题出发:他们使用的某个库会断言socket的文件描述符必须大于0,但系统运行一段时间后这个断言会失败,意味着有人错误地关闭了标准输入(fd=0)。 面对这个难题,作者没有选择在每个close调用处手动添加日志(工作量大且易遗漏),而是利用了Linux下动态链接的一个精妙特性:`LD_PRELOAD`。文章详细展示了如何编写一个名为`my_close.c`的共享库,在其中重新定义`close`函数。这个函数会先检查传入的fd是否为0,如果是则直接让程序崩溃(coredump),否则通过`dlsym`获取并调用原始的`close`函数。 通过设置`LD_PRELOAD`环境变量指向这个自定义库,程序在运行时就会优先加载它,从而劫持所有的`close`调用。这样,一旦程序中有代码试图关闭标准输入,就能立刻被定位到。整个过程巧妙地利用了系统机制,将原本需要大范围排查的问题,转化为了一个精准的触发点,是调试动态库和大型程序时一个非常实用的技巧。

IT 累计浏览 3,710

Linux 系统文件描述符继承带来的危害

这篇讲的是 Linux 系统里一个看似无害、却可能被利用的特性——文件描述符的继承机制。 很多开发者和运维人员可能都注意到,当一个进程派生子进程时,父进程打开的文件描述符默认会被子进程继承。文章从这个常见的进程行为切入,揭示了其背后被忽视的风险。如果父进程打开了敏感文件(如密钥、密码文件),而子进程的来源不可信(比如执行了用户可控的脚本),攻击者就可能通过恶意子进程访问到这些本不该暴露的资源。更麻烦的是,这种访问是静默的,日志里通常不会留下记录。 文章进一步分析了这种“继承漏洞”在实际环境中的攻击路径。例如,一个以 root 身份运行的 Web 服务,如果其工作进程意外 fork 并 exec 了某个 shell,攻击者就可能间接获取到 root 的权限。作者结合具体场景,阐述了风险从配置不当到实际可被利用的演进过程。 最后,文章也给出了清晰的防御指南:在编写可能创建子进程的代码时,应该有意识地关闭那些不需要传递的文件描述符。对于关键应用,可以使用 `CLOEXEC` 标志来精确控制。它提醒我们,在复杂的系统中,一些“默认行为”往往是安全盲区,需要开发者主动去管理。