日日夜夜搞程序的你,是否注意到这样一个细节?

当我们在资源管理器中的某个文件夹里以管理员身份启动命令行的时候,你会发现:启动的命令行的初始文件夹会被忽略,命令行初始文件夹始终被设置为系统文件夹(system32),这是为什么?

问题答案:为了规避某些类型的攻击(所谓的”当前文件夹攻击”),下面细说。

根据动态链接库的搜索顺序规则,在步骤 5 中,在可执行文件夹和各种系统定义的文件夹之后搜索当前文件夹。

如果程序调用 LoadLibrary 并且未传递完全限定的路径,并且在前四个位置之一中找不到 DLL,则将搜索当前文件夹。

攻击者可以将 DLL 拖放到某个文件夹中,并诱骗您运行将该文件夹中的程序。当该程序尝试加载通常不存在的库时,将找到并加载攻击者创建的库,这可不妙,因为这会导致执行攻击者精心设计的恶意代码。

请注意,此行为仅适用于 Windows 二进制文件,并且仅当它们通过提升提示启动时才适用。(不属于 Windows 的程序不会收到此行为,因为兼容性测试表明,第三方应用程序严重依赖于跨提升边界保留的当前文件夹。例如,安装程序会将其内容解压缩到一个临时目录中,切换到该临时目录,然后运行主安装程序。)

总结

所以,当你为这个问题抱怨微软的设计老是不得我心的时候,请思考下:”这也是为了你的安全着想”。
拓扑梅尔智慧办公平台 (TopomelBox) 就算开发进度再慢,涉及安全方面的问题,我一定会停下脚步,深入研究。
安全无小事,你的客户愿意执行你的程序,就说明他信任你,我们作为开发者不能辜负这份信任。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why is my starting directory ignored when I elevate a command prompt?》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

打开网易新闻 查看更多图片