質問

私はSQL 侵入検知システム(IDS)と私は解析が必要ですSQLクエリ独自のSQLパーサーの書き込みは長期タスクであり、ネイティブパーサで使用されるロジックを正確に反映します。 MySQLには、主なソースファイルsql/sql_lex.ccsql/sql_yacc.yからBisonで構築されたシンタックスアナライザが字句解析装置があることがわかりました。私はこの堅調な解決策を再利用することに本当に興味があります。私はC / C ++でIDを構築しているので、MySQLパーサーを自分の検出システムと接続するためのいくつかの方法を探しています。

MySQLパーサー(語彙+構文アナライザ)を再利用して、ある論理形式でSQLクエリの構造を取得することが可能であるか疑問に思いました。構文ツリーそれは可能でしょうか?関連テキスト、チュートリアル、またはプロジェクトがいくつかありますか?

ありがとう

役に立ちましたか?

解決

私のIDの最初のバージョンを私の学士プロジェクトの一部として終えました。 MySQL用のプラグインとして実装されています。

MySQL内部を参照するための主な原因を一覧表示します。それから私は私のIDSで使用したアプローチをまもなく説明します。

MySQLのマニュアルテキスト

  • 私は本を見つけました expert mysql によって charles bell Sharge> Sharge> Shard>(user3822447が書いたので) )MySQLの内部を理解するための非常に良い入場点であること。
  • MySQL 5.1プラグイン開発 Andrew Hutchings&Sergei Golubchik も非常に便利です。
  • MySQL Internalsマニュアル には、基本も含まれていますで始まるのが良い情報。
  • 結局読んだ後、私はSOM デバッグ(VSを使って)し、クエリツリーの構造体のように見える方法を検出しました。

IDSのための私の解決策

私の解決策のソースコードは、 SourceForge にあります。私はそのWikiにそれをもう少し文書化することを計画しています。

主エントリポイントは、audit_ids_notify()audit_ids.cc関数です。プラグインは、内部MySQL Parser Aによって生成されたクエリツリーを受け取ります(メモリを保存するために)。それから、それは誤検出を検出します - それは既知のクエリツリー構造のリストを持ち、各クエリツリー構造の各パラメータ化可能部分に関する統計情報を保持します。出力はMySQLデータディレクトリ内の特別なログファイルに書き込まれます。

私は解決策をモジュール的かつ拡張可能にしようとしました。初期バージョンは一種のデモストレーションであり、パフォーマンスは特にSQLストレージモジュールでは最適化されていません。

MySQLプラグインタイプ

私は2つの可能なアプローチを特定し、最初のものを使用した。

  1. 監査プラグイン
    • 私の解決策プラグインのラッパーの種類は 監査プラグイン
    • サーバー操作を報告するために使用されるにもかかわらず、このタイプのプラグインを使用しました(例えば、クエリやエラーを記録します)。
    • このタイプのプラグインを選択しました。これは、クエリツリーが完了後(つまり解析)の後に呼び出される唯一のネイティブサポートプラグインで、メモリから解放される前に(MySQL 5.6.17用)と呼びました。 )。
    • 短所:上記は将来のバージョンのMySQLでは完全に保証されていませんが、私の意見では、緊密な将来に変わるべきではありません。
    • 優位:MySQLは再コンパイルする必要はありません。プラグインを作成してインストールするのに十分です。

    1. query-rewriteプラグイン
      • 非ネイティブプラグインタイプ query-rewrite 。それはまたそれを読むためのクエリを修正するためのプラグインAPIを証明しました。
      • disadvantant :このプラグインAPIをサポートするには、MySQLサーバーをAPIと再コンパイルする必要があります。私はMySQL生産配布の一部になるかもしれません。
      • 優位:内部クエリツリーの読み書き用に設計されたプラグインタイプ
    2. このトピックに関連する質問/問題がある場合は、お気軽に答えることができます;)

他のヒント

私は可能であると信じています。 Sharles BellまたはSasha Pachevによって「Expert MySQL」などの高度なMySQL Internals Bookを試してください。 MySQLは、カスタムハンドルのレクサーと、それらのLexerが互換性のある一般的なバイソン互換のパーサーを使用します。

それ以外の場合は、クエリを解析するよりも簡単なソリューションを見つけることができます。

  • 戦略#1:クエリを捨て、クエリ内の文字列の内容を見てください。 SQLキーワードなどの可能な攻撃ベクトルを探してください。これは攻撃の試みを検出する可能性があります。
  • 戦略#2:すべてのユーザー入力を捨て、残りのクエリ内容のリストを作成します。キーワードのすべてのクエリパターンのリストを作成し、それらを互いに比較します。誰かがクエリを正常に変更したことを示す異常構造を持つクエリを探します。

私はSQL Guruではありませんが、最も基本的な戦略はパラメータ化されたクエリを使い、普及試行を無視することです。インターネット上のそのような試みは、明らかな弱さを探すために設計された一般的なランダムなクエリであり、どこでも基本的なセキュリティ練習に従うならば安全に無視され得る。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top