コードの質が低いと、予測できない動作につながります。ユーザーの視点には、それがしばしば使い勝手の悪さとなって現れます。攻撃者にとっては、予期せぬ方法でシステムにストレスを与える機会となります。
SqlClientPermission
オブジェクトを構成します。この例のプログラムは、ユーザーがパスワードを空欄にして接続できるかどうかを制御するコンストラクタに false
を 2 番目のパラメーターとして渡しています。このパスワードに False を渡すと、空欄のパスワードは許容されなくなります。
...
SCP = new SqlClientPermission(pstate, false);
...
PermissionState
オブジェクトが 2 番目のパラメーターとして渡されるあらゆる値より優先されるため、コンストラクタはパスワードを空欄にしてデータベースに接続することを許容し、2 番目の引数に反する事態が発生します。空欄のパスワードを拒否するには、プログラムがコンストラクタの最初のパラメーターに PermissionState.None
を渡すようにします。誤った解釈を生む危険がなく同じ情報を伝達できる単一パラメーターのバージョンに比べた場合、このような機能的なあいまいさが存在しているため、パラメーターを 2 つ取るバージョンの SqlClientPermission
コンストラクタの仕様は現在の状況には適当でないものとなっています。getpw()
を使用して平文のパスワードが、暗号化されたユーザー パスワードと一致するかどうかを検証しています。パスワードが有効であれば、関数は result
を 1 に、それ以外の場合は 0 に設定します。
...
getpw(uid, pwdline);
for (i=0; i<3; i++){
cryptpw=strtok(pwdline, ":");
pwdline=0;
}
result = strcmp(crypt(plainpw,cryptpw), cryptpw) == 0;
...
getpw(
) 関数が問題になることがあります。これは、2 つ目のパラメーターに渡されたバッファがオーバーフローするためです。この脆弱性のために、getpw()
は、getpw()
と同じルックアップを実行しても、静的に割り当てられた構造体にポインタを戻す (リスクを緩和するため) getpwuid()
に置き換えられてきました。
...
String name = new String(nameBytes, highByte);
...
nameBytes
で表される文字列のエンコードにどの文字セットが使用されているかによって、コンストラクターがバイトを文字に正しく変換できない可能性があります。文字列のエンコードに使用される文字セットの進化により、このコンストラクターは非推奨となり、パラメーターの 1 つとして、変換のためにバイトをエンコードするために使用される、charset
という名前のパラメーターを受け入れるコンストラクターに置き換えられました。Digest::HMAC
stdlib を使用しています。これはリリース内に誤って含まれたために、ドキュメントで明示的に使用を禁止しています。
require 'digest/hmac'
hmac = Digest::HMAC.new("foo", Digest::RMD160)
...
hmac.update(buf)
...
Digest::HMAC
クラスは、リリース内に誤って含まれたため、追加直後に廃止されています。実験的で適切にテストされていないコードであり、期待どおりに動作しない可能性があるため、特に HMAC の暗号化機能に関する関係を考慮すると、この使用を避けることを強くお勧めします。IsBadXXXPtr()
クラスを使用すべきではない理由は多数あります。これらの関数には次のような特徴があります。IsBadWritePtr()
が使用されています。
if (IsBadWritePtr(ptr, length))
{
[handle error]
}