奇淫巧技之程序啓動後在進程列表中隱藏密碼等關鍵信息

最近讀了下mongodb的源碼。mongodb

這個過程當中,發現了一個頗有意思的代碼段,即程序啓動後,如何在進程列表中隱藏敏感信息如密碼的處理。數組

先說下使用場景:ide

mongodb支持服務端js腳本,因此咱們寫了一些服務端js腳本好比檢查複製集狀態之類。函數

這樣,咱們可使用「mongo ip:port/dbname /path/test.js」這種方式來執行服務端js。spa

可是mongodb複製集初始化以後,咱們又加了帳號認證。在不登陸的狀況下,確定是無法執行的。命令行

因此最終命令變成了這個樣子:指針

mongo ip:port/dbname -u user -p password /path/test.jsorm

mongo在使用過程當中,必然會在進程列表中打印上面的賬號密碼。可是在使用過程當中,咱們看到,實際上mongo對應的進程列表中,密碼字段是一堆的「x」。感受很神奇,後面看了mongodb的源碼以後才發現,原來這是mongo客戶端入口處作了特殊的處理,屬於一種「奇淫巧技」。進程

先直接上代碼:ip

 

int _main(int argc, char* argv[], char** envp) {

    省略中間一些代碼內容

    // hide password from ps output

    for (int i = 0; i < (argc - 1); ++i) {

        if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--password")) {

            char* arg = argv[i + 1];

            while (*arg) {

                *arg++ = 'x';

            }

        }

    }

 

二進制可執行程序,一般均可以接收外部參數,在入口處都會傳一個argc表示命令行的參數個數,一個argv的參數列表數組(字符指針數組)傳入具體的參數。

mongo在啓動中,賬號密碼字段就經過argv傳給了程序。

由於參數列表數組的內容不是常量,能夠修改。因此,mongo在檢測到了到了若是參數列表中有密碼字段(密碼是經過-p password 或者—password password格式傳入的,因此能夠檢查參數列表中有沒有「-p」或者 「—password」),就把密碼中每一個字符修改成「x」。

這樣,最終在進程列表中查詢的時候,天然密碼部分就是一堆的」x」了。

總結:本篇講的在進程列表中隱藏密碼關鍵信息的方式是修改main函數入參.

雖然mongo的這種處理方式頗有創意,可是仍是有失效時候。後面的文章我會再介紹,今天先寫到這裏。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息