EN JP CN

SV.USAGERULES.PROCESS_VARIANTS

SV.USAGERULES.PROCESS_VARIANTS

進行中の特権昇格の露呈

このチェッカーは Windows プラットフォーム上の問題のみをレポートします。

一部のプロセス作成システム呼び出しにより、ローカル権限昇格の危険にさらされています。これらの呼び出しは、ホストプロセスの特権で悪意のあるコードの実行を許可する攻撃に脆弱です。SV.USAGERULES.PROCESS_VARIANTS チェッカーは、次のシステム呼び出しにフラグを立てます。

  • CreateProcess
  • CreateProcessAsUser
  • CreateProcessWithLogon
  • ShellExecute
  • ShellExecuteEx
  • WinExec
  • システム
  • _wsystem
  • _*exec*
  • _*spawn*

脆弱性とリスク

プロセス作成システム呼び出しに、プロセス作成 API を呼び出す前の適切な位置に .exe 実行可能ファイルのフルパスが含まれていない場合、プロセス作成システム呼び出しが攻撃の機会の要因となります。検索パスの脆弱性により、ローカルユーザーは悪意のある .exe ファイルを使用して特権を取得できます。

軽減と防止

攻撃にさらされることを回避するため、fork (vfork ではありません)、execve、および pipes を使用して、プロセス実行を完全に制御します。

脆弱コード例 1

この例では、Klocwork は 4 行目で、関数 execlp の使用にフラグを立てます。このシステム呼び出しにより、悪意のある .exe ファイルを通じてローカル権限昇格の危険にさらされる可能性があります。

1   #include <process.h>
2    
3   void foo() {
4       _execlp("li", "li", "-al", 0);
5       _wexeclp((wchar_t *)"li", (wchar_t *)"li", (wchar_t *)"-al", 0);
6   }

修正コード例 1

修正されたコードでは、関数 execlp は execve に置換されました。これにより、プロセス実行が制御され、特権昇格の可能性が排除されます。

1  #include <process.h>
2  void foo() {
3     execve("li", "li", "-al", 0);  
4  }

脆弱コード例 2

この例では、Klocwork は 13 行目について SV.USAGERULES.PROCESS_VARIANTS エラーをレポートします。システム関数呼び出しコマンドは、チェックなしでホスト環境シェルによって実行されるため、ローカル特権昇格の可能性にさらされます。

1   #include <stdio.h>
2   #include <sys/types.h>
3   #include <sys/stat.h>
4     
5   int main(int argc, char *argv[]) {
6     int fd;
7    
8     if ((fd = open(argv[1], 0)) == -1) {
9       error("can't open %s", argv[1]);
10      return -1;
11    }
12    if (argc == 2) {/* execute command */
13      if (system("/bin/sh/", "sh", "-c", argv[1], (char*) 0)) { /* SV.USAGERULES.PROCESS_VARIANTS reported here */
14   
15          /* some code */
16        } else {
17          error("can't execute %s", argv[1]);
18        }
19    }
20  }

修正コード例 2

修正された例では、このシステム関数は再度 execve に置換されました。これにより、プロセス実行が制御され、特権昇格の可能性が排除されます。

1   #include <stdio.h>
2   #include <sys/types.h>
3   #include <sys/stat.h>
4    
5   int main(int argc, char *argv[]) {
6     int fd;
7     
8     if ((fd = open(argv[1], 0)) == -1) {
9       error("can't open %s", argv[1]);
10      return -1;
11    }
12    if (argc == 2) {/* execute command */
13      if (execve ("/bin/sh/", "sh", "-c", argv[1], (char*) 0)) { * / SV.USAGERULES.PROCESS_VARIANTS not reported */
14   
15          /* some code */
16        } else {
17          error("can't execute %s", argv[1]);
18        }
19    }
20  }