2013-10-29 54 views
1

我有一個C++程序,它將以root身份運行某些特定的命令。這是需要的原因是因爲在Node.js下運行的另一個程序需要執行諸如設置系統時間,設置時區等需要root特權才能完成的事情。在使用setuid命令後,我正在使用C++中的函數execve以root權限進行系統調用。我特別選擇execve命令,因爲我想隔離環境,所以我不創建環境變量漏洞。有沒有辦法找出可執行文件需要/使用哪些環境變量?

setuid(0); 
execve(acExeName, pArgsForExec2, pcEnv); 

我想要做的是準確找出pcEnv,它是程序需要執行的程序的環境變量列表。例如,如果我想運行time-admin工具,就好像我是從控制檯運行它一樣,如何才能找出它需要的環境變量。我知道我可以用命令printenv打印環境變量,但是這給了我所有的人。我很確定我不需要它們,並希望儘可能小。

我知道我可以全部使用它們,然後慢慢評論每一個,看看它是否繼續工作,但我真的寧願不去那麼遠。

任何人都有一個聰明的方法來找出哪些環境變量被程序使用?我應該添加我在Ubuntu 12.04 LTS安裝中執行此操作。

感謝您的任何幫助。

+0

除非程序正在做一些有趣的事情,ltrace應該是有用的 – PlasmaHH

+1

@PlasmaHH有趣的你的意思是像使用非標準的但通常實現的第三個參數'main()','char * envp []'?因爲在那種情況下,沒有問作者,閱讀文檔,或者看到實際的來源,我認爲OP沒有一個槳就是一條小溪。 – WhozCraig

+0

@WhozCraig:不過,我發現envptr在現代C語言和通用C++代碼中使用的頻率低於在較早的C代碼中使用的頻率。但是,所有的猜測都不會比閱讀精美的手冊更好。 – PlasmaHH

回答

2

有沒有一般的方法來找出一些程序使用的環境變量。例如,可以想象一個程序有一些配置文件,它們給出了環境變量的名稱。

實際上很多shell程序(或腳本解釋器)正在這樣做。

更一般地說,可以計算出getenv(3)的參數。所以理論上你不能猜測它的可能值。 (我可能是錯的,但有些舊版本的libcbash用來玩這種技巧;不幸的是,我忘記了細節,但有時候會使用名稱中帶有一些pid號的環境變量)。

而且,正如其他人評論說,您可能需要使用ltrace(或播放LD_PRELOAD技巧),或使用gdb,找出如何getenv叫...

和應用程序也可能使用environ變量(見environ(7) ...)或第三個參數main ....

然而在實踐中,一個合理的書面程序應當明確說明它是使用所有的環境變量....

如果您有權訪問程序的源代碼,那麼如果它由GCC編譯,則可以使用MELT plugin(剛剛發佈的版本1.0)。 MELT是擴展GCC的領域特定語言,可用於在編譯程序時探索由GCC處理的內部Gimple表示。特別是對於其新的findgimple mode,您可以用一個常量字符串在一個命令中找到所有對getenv的調用。

相關問題