2017-12-14 17 views
1

私はオンラインジャッジのコード安全性プロジェクトに取り組んでいます。 1つの脆弱性は、誰かが次のようなコードをアップロードした場合です。#include "/ dev/whatever"にスタックされていません

#include "/dev/stdin" 
#include "/proc/self/fd/0" 
#include <stdio.h> 
// Other legitimate code 

私はそれを再現しようとしています。 gcc foo.cでコンパイルすると、gccがスタックし、EOF(Ctrl-D)が期待どおりになるまで端末から読み込みます。私がclang foo.cの時、何も起こらなかった。 Clangは、行が存在しなかったかのように振る舞います。次に、これらのコードを試しました:

#include "/dev/zero" 
#include "/dev/random" 
#include "/dev/ram" 

まだ運がありません。なぜClangはこれらすべてを無視するのですか?どうすればClangを#includeに貼り付けることができますか?

+0

"なぜClangはこれらすべてを無視しますか?"何故なの? –

答えて

2

fifoを作成し、#includeします。 これはclangを停止するように見えますが、それはそれから読むことはありません。 これはclangチームがこれを見るまで機能しないかもしれません....

+0

名前付きパイプの素晴らしいアイデア! – iBug

2

C標準で指定されている

形態の前処理指令

# include <h-char-sequence> new-line 

検索指定された配列によって一意に識別されるヘッダ の実装に定義された場所の配列... [ ]。 場所がどのように指定されているか、またはヘッダ が識別されているかどうかは実装定義です。

形態

# include "q-char-sequence" new-line 

の前処理指令は、「 デリミタの間に指定された配列によって同定 ソースファイルの全体の内容によってその命令の交換を引き起こす。という名前のソースファイルであります 実装定義の方法で検索しましたこの検索がサポートされていない場合、または が検索に失敗した場合、その指示は読み取られたかのように再処理されます。

# include <h-char-sequence> new-line 

オリジナルの指示文に含まれる同一の文字列(>が含まれている場合はそれを含みます) 。

C2011 6.10.2/2-3;強調付加)特に

、C実装は、絶対パス絶対パスの形状を有するヘッダ名を解釈するために必要されるものではありません。このようなヘッダー名は、準拠しているコンパイラが一意のマッピングを提供しなければならないものでさえも含まれません。

準拠Cコンパイラは、実装定義のすべての動作を文書化する必要があります。 GCCはこの領域をカバーするドキュメントを提供していますが、それらのドキュメントは絶対パスを明示的に扱っていないようです。しかし、GCCが指定されたパスを使用していることは私には合理的です。 Clangは明らかに異なった振る舞いをしていますが、実装定義の振る舞いを文書化していません(したがって、その点で不適合です)。その出力は、それが何をしているかについての手がかりを与えるかもしれません。

更新:

なぜクランは、これらすべてを無視するのですか?

あなたはクランが何をしているかの詳細を決定するために、その原因を調べることができますが、クランはそのように実装されている理由だけクランの開発チームは確かにあなたの言うことができます。おそらく、その開発者はあなたのホステッドサービスの使用事例を予期し、意図した種類の攻撃に対して意図的にClangを強化したのかもしれません。

#を含めることでClangを固執させるにはどうすればよいですか?

あなたがすでに試したアプローチが最も可能性の高い方法です。彼らがうまくいかなかったら、そうした方法でクラングを破る方法がないかもしれません。

関連する問題