User Tools

Site Tools


ja:rule:out:エスケープの必要がないapiの制限を熟知する

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ja:rule:out:エスケープの必要がないapiの制限を熟知する [2016/06/28 06:39] – [非適合コード例(Execv, Execve)] yohgakija:rule:out:エスケープの必要がないapiの制限を熟知する [2016/06/28 06:56] (current) – [適合コード例(Validation)] yohgaki
Line 39: Line 39:
  
  
-===== 非適合コード例(ExecvExecve) =====+===== 非適合コード例(execvexecve) =====
  
 OSのシステムコールとしてexecv/execveなどを利用するAPIを用いれば、OSコマンドの引数をエスケープせずに安全に利用できる。execv/execveはコマンドと引数を分離するが、コマンド自体が変数の場合は任意コマンドを実行できる。 OSのシステムコールとしてexecv/execveなどを利用するAPIを用いれば、OSコマンドの引数をエスケープせずに安全に利用できる。execv/execveはコマンドと引数を分離するが、コマンド自体が変数の場合は任意コマンドを実行できる。
Line 47: Line 47:
 <code php> <code php>
 <?php <?php
-pcntl_exec('/path/to/user/cmd/'.$_GET['cmd'],$_GET['params']); +pcntl_exec('/path/to/user/cmd/'.$_GET['cmd'], $_GET['params']); 
 </code> </code>
 +
 +上記のコードには2つの問題がある。
 +
 +  * execv, execveシステムコールはコマンドとその引数を分離するが、コマンド部分がインジェクションに脆弱である場合、安全性を維持できない。(SQLのプリペアードクエリにおけるプリペア文とパラメーターの関係と同じ)
 +  * execv, execveシステムコールはコマンドとその引数を分離するが、コマンドに脆弱性がある場合、安全性を維持できない。(コマンドの引数を更に別のコマンドの引数に利用する場合などにこの問題が発生しうる。シェルスクリプトなどではこのような状況は容易に起こり得る)
 +
  
  
 ===== 適合コード例(Validation) ===== ===== 適合コード例(Validation) =====
 +
 +通常のホワイトリストによるバリデーションを行う。
  
 <code php> <code php>
 +<?php
 +if (!isset($_GET['cmd']) || strspn($_GET['cmd'], 'abcdefghijklmnopqrstuvwxyz') !== strlen($_GET['cmd'])) {
 +  throw Exception('cmd validation error');
 +}
 +foreach($_GET['params'] as $param) {
 +  if (strspn($param, 'abcdefghijklmnopqrstuvwxyz1234567890') !== strlen($param)) {
 +    throw Exception('param validation error');
 +  }
 +}
 +
 +pcntl_exec('/path/to/user/cmd/'.$_GET['cmd'], $_GET['params']); 
 </code> </code>
 +
 +バリデーションの注意点
 +
 +  * コマンド引数でパストラバーサルが可能な場合、任意コマンドに実行許してしまう。コマンドとして"."(ピリオド)、"/","\"(スラッシュ、バックスラッシュ)の許可には十分な注意を払う。
 +  * パラメーター引数は指定したコマンドにより、更に別のコマンド実行に利用される可能性もある。この為、シェルの特殊文字を一文字でも許可するとリスクが発生する。文字種によるバリデーションより、特定の文字列のみをホワイトリスト形式でバリデーションする方がより安全性が高い。
  
  
ja/rule/out/エスケープの必要がないapiの制限を熟知する.1467095950.txt.gz · Last modified: 2016/06/28 06:39 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki