2011-08-10 10 views
2

getmodulefilenamew関数は、2番目の引数をこの例では固定サイズのbufferとして受け入れるので、誤検出(バッファオーバーフロー)を引き起こします。バッファオーバーフローまたは偽陽性?

しかし、そのドキュメントを覗き:http://msdn.microsoft.com/en-us/library/ms683197%28v=vs.85%29.aspx

引用:バッファはモジュール名を保持するには小さすぎる場合、文字列が終端のNULL文字を含むnsizeの文字に切り捨てられ、関数はnsizeの場合を返し、機能を最後のエラーをERROR_INSUFFICIENT_BUFFERに設定します。

誰かが信頼できる第三者である場合、この問題を偽陽性として確認または拒否できますか?ご協力いただきありがとうございます!

===

HMODULE applicationModule = GetModuleHandleW(NULL); 
WCHAR processName[MAX_PATH]; 
memset(processName, 0, sizeof(processName)); 
GetModuleFileNameW(applicationModule, processName, sizeof(processName)); 

===

問題は、スキャンのVeraCode静的アナライザによって提供された

GetModuleFileNameW機能付きラインです。

+0

何らかの静的検査ツールについて話していますか?どちらを教えて、あなたのコードを教えてください。そうでなければ、意味のある答えのチャンスはありません。 –

+0

私の悪い、申し訳ありません。私は質問を更新しました。 –

答えて

2

nSizeに間違った値を渡しているという問題があります。バイト数を渡していますが、文字数を渡す必要があります。MAX_PATH。これらの値は、ワイド文字のサイズが2バイトであるために異なります。

はい、はい、コードにエラーがあります。モジュール名が十分に長い場合、Windowsは260文字までのバッファに最大520文字を書き込もうとします。

+0

私は理解しています。 この場合、バッファは単に使用可能な最大サイズ+ヌル終了文字に切り捨てられるため、バッファオーバーフローは不可能です。 これについてコメントしたり承認したりするだけの人が必要です。そのような質問で迷惑を掛けて申し訳ありません。 –

+0

いいえ、バッファオーバーフローは非常に可能です。バッファーはあなたが言うよりも小さいです。 260文字を超えるモジュール名の場合、バッファオーバーランが発生します。 –

+0

But: "モジュール名が指定されたバッファより大きい場合、関数はnSize文字をバッファに書き込み、残りの文字を切り捨てます。" はい、このような場合、フルネーム(260+)は表示されませんが、代わりに名前が切り捨てられます。この文書は正しいと思いましたか? –

関連する問題