2000P's Blog

最初のページ

ユニバーサル署名のためのパターン言語

著者 gardner 時間 2020-03-19
all

PTアプリケーションインスペクタのシグネチャベースのコード解析のプロセスは、次の段階に分かれます。

本論文では,パターン記述の方法,パターン記述を可能にするカスタムdsl言語の開発,及びこの言語で書かれたパターンを第3段階に焦点を当てた。

パターン記述方法

ハードコードパターン

パターンを手動でコードの中に直接書くことができます。パーサーを開発する必要はありません。このアプローチは、非開発者には適していませんが、単位テストを書くために使用できます。新しいパターンの追加は、プログラム全体の再コンパイルが必要です。

JSON、XMLまたは他のマークアップ言語

比較されたASTの部品は、JSONまたは他のデータフォーマットから直接格納されて、読み出されることができます。このアプローチは、外部ソースからパターンを読み込むことができます。しかし、構文は、ユーザーによって編集に適していて、不適切です。なお,この方法は木構造の直列化に利用できる。(シリーズの次の記事では、. NETでのツリー構造のシリアル化とバイパスの方法を紹介します。

パターン記述のためのカスタム言語

第3のアプローチは、容易に編集可能で、簡潔であるが、現存する、そして、将来のパターンを記述するのに十分な表現力をまだ持っている特別なドメイン特有の言語の開発です。このアプローチへの制限は構文とパーサーを開発する必要です。

実行性

第1項で述べたように、正規表現を用いてパターンをすべて記述することはできない。DSLは正規表現とプログラミング言語の頻繁に使用される構造の混合です。加えて、この言語はいくつかの特定のドメイン知識のために設計されています。

構文

シリーズの2番目の記事は、命令型プログラミング言語の基本的な構文がリテラル、式、およびステートメントであるという事実を議論します。DSL言語の開発に類似したアプローチを用いた。式の例

命令は、式の最後にセミコロンを追加することによって作成されます。

リテラルは以下のような原始的な型です:

これらのリテラルでは、単純な構造体を記述できますが、それらを使用して数値の範囲や正規表現を記述することはできません。より複雑なケースを扱うために、高度なコンストラクタ(PatternStatement、Patternexpression、およびTatternLiteral)を導入しました。このような構造体は特別な<[ and ]>ブラケットで囲まれている。構文はNemerle Language Lung(この言語は擬似引用符のためにこれらの特別な括弧を使用します)、すなわち、これらの括弧のコードをAST木に変換します。

サポートされている高度な構造の例を以下のリストに示します。いくつかの構造体に対して読みやすくするための構文的糖が導入されている。

パターンの例

ハードコード化されたパスワード(すべての言語)

?<?パスワード( ?\- I )[<[]\ w *"]>

弱乱数発生器

新しいrandom (...)

不足は乱数を生成するための安全でないアルゴリズムを使用することに起因する。しかし、標準のランダムクラスのコンストラクタは、そのような場合を監視するために使用されます。

デバッグ情報リーク( PHP )

設定.i )^ write $ ]>(" debug ", <[ 1 ..] 9 ]>

安全でないSSL接続

新しいAllowAllHostNameIrifier (...) <[ Radio ]]> SSLocketFactory . allowHorHortHornameHeight検証子

構文構造を持つ“論理OR”を使う。構造体の両方の左(コンストラクタ呼び出し)と右(定数を使用する)に一致します。

コメント:<["パスワード( ?\- I \\ S *\="

ソースコードのコメントを検索します。単一の行コメントはダブルスラッシュ(/ c)で始まります。

SQLインジェクション( C - CHERUNK , Java , PHP )

<["I :\ w *"を選択します。

単純なSQLインジェクションは、右側の非文字列式を選択してから始まる文字列の連結です。

安全な属性のないクッキー

-

クッキーは安全なフラグなしでセットされました。

空のtry catchブロック(すべての言語)

{ } }キャッチ{ }

空の例外処理ブロック。パターンマッチングモジュールがC個のソースコードを解析すると、次のコードがマッチします。

トライ

{ }

キャッチ

{ }

T - SQLソースコードの照合結果

BEGIN TRY SELECT 1/0 AS DivideByZero END TRY BEGIN CATCH END CATCH

PL / SQLソースコードの照合結果

PROCEDURE empty_default_exception_handler IS BEGIN INSERT INTO table1 VALUES(1, 2, 3, 4); COMMIT; EXCEPTION WHEN OTHERS THEN NULL; END;

不安定なクッキー

クッキー<[@クッキー] >=新しいクッキー

...

setAccept ( true );

...

レスポンスを指定します。

安全なフラグなしでクッキーを加えること。このパターンは、taint解析を使用して実装する方が良いという事実にもかかわらず、さらに原始的なマッチングアルゴリズムを使用して実装することができました。このアルゴリズムはピン付けされた@ cookie変数(regexの後ろの参照との類推)、式の否定、および任意の数の文を使用します。

カーソルのsnarfing ( PL / SQL , T - SQL )

PL / SQL

カーソルを指定します。

...

カーソル(<[@カーソル]>);

T - SQL

カーソルを指定します

...

<[~]> Deallocate (<[@ cursor ]>);

ダングリングカーソルは、より特権のないユーザによって利用できます。さらに、ほとんどの未リリース資源問題は一般的なソフトウェア信頼性問題をもたらす。

パターンマッチングモジュールがT - SQLソースコードを解析する場合、次のコードが一致します

カーソルカーソルを宣言する

SELECT EmployeeID, Title FROM AdventureWorks2012.HumanResources.Employee; OPEN Employee_Cursor; FETCH NEXT FROM Employee_Cursor; WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Employee_Cursor; END; --DEALLOCATE Employee_Cursor; is missing GO

特権を過度に与えた( PL / SQL , T - SQL )

すべての

この欠陥は、ユーザーに割り当てられた不適切で過度の特権をもたらすかもしれません。グラントのすべてのフレーズは実際にSQLクエリであるが、パターンマッチングモジュールが“query”の概念を持っていないので、関数呼び出しに変換される。

以下のコードがマッチされます。

概要

我々は、PTアプリケーションインスペクタでパターンマッチングモジュールの機能性を示すためにビデオを準備しました。このビデオでは、異なるプログラミング言語で書かれたソースコードの特定のパターンに対するマッチングのプロセスを説明します。また、このシリーズの最初の記事で議論された構文エラーを扱う適切な方法を示します。

次回は次のようにします。

Ivan Kochurkin ,ポジティブテクノロジー