コメントで、使用__func__
はセキュリティ上のリスクであることがわかりました。私はそれがどのように起こっているのかを理解する必要がありますか?
4 に答える
を使用__func__
すると、バイナリ内の関数名が明らかになり、バイナリにアクセスできる攻撃者の作業が容易になります。
リバースエンジニアリングが容易になります。したがって、アプリケーションの動作を秘密にしておきたい場合は、攻撃者の生活を楽にします。
これは、DRM機能に関連する場合、または競合するアプリケーションでアルゴリズムを模倣するのを難しくしたい場合に関連します。
ただし、元に戻すと脆弱性が表示されるアプリケーションはそもそも安全ではなかったため、セキュリティには影響しません。
アプリケーションのセキュリティがその関数名が秘密のままであることに依存している場合__func__
、コンパイラはコンパイルされたバイナリのどこかに関数名を格納する必要があるため、を使用することはセキュリティ上のリスクです。
__func__
関数内で使用される場合に関数名を含む文字配列変数に展開されるC99標準の定義済み識別子です。C99 6.4.2.2 / 1から、次のように説明されています。
識別子
__func__
は、各関数定義の開始中括弧の直後に宣言されているかのように、トランスレータによって暗黙的に宣言されます。static const char
__func__
[]="関数名"; ここで、function-nameは字句的に囲む関数の名前です。この名前は、関数の装飾されていない名前です。
これはマクロではなく、前処理中に特別な意味を持たないことに注意してください。
詳細については、次のリンクを参照してください__func__
:
http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1642.html
ソリューションが事前定義されたコンテキスト依存定数に含まれる拡張に依存している場合、 __func__
関数に安全に実装できず、同じ便利さを提供できません。
__func__
は呼び出しの時点でテキストで展開されるため、break、continue、returnステートメントを評価したり、ifステートメントを適切に終了できなかったりすると、呼び出しコードの制御フローに簡単に影響を与える可能性があります。それを呼び出すことの効果は驚くべきものであり、微妙な欠陥につながる可能性があります。
関数のようなマクロまたは。よりもインライン関数または静的関数を優先します__func__
。
ただし、a__func__
の定義が避けられない場合は、呼び出し元のコードの制御フローを変更するステートメントを定義しないようにする必要があります。理想的には、単一の式にする必要があります。
その他のアイデアとサンプルコード:
https ://www.securecoding.cert.org/confluence/display/seccode/PRE13-C.+Avoid+changing+control+flow+in+macro+definitions