ブログ

Little bobby tablesを拘留所に送る

Google Cloudとコンテナの継続的なセキュリティ

本文の内容は、2016年8月11日にSysdigのMark Stemmが投稿したブログ(https://sysdig.com/blog/sending-little-bobby-tables-detention/)を元に日本語に翻訳・再構成した内容となっております。

Little Bobby Tablesは、SQLインジェクション攻撃を避けるためにデータベース入力を無害化するのが良い理由を示しています。

SQLインジェクション攻撃の概念に精通していない場合、簡単な要約を以下に示します。

  • 記述が不十分なソフトウェアは、入力をサニタイズしたり、ステートメントの構成可能部分を入力値に適切にバインドしたりすることなく、id =およびユーザー提供データの従業員からの給与の選択などのSQLステートメントフラグメントの組み合わせを使用します。
  • 攻撃者は、ユーザーが提供したデータに2番目のSQLステートメントを追加してクエリを実行します。 たとえば、攻撃者は10を提供できます。 データベースの従業員をドロップします。 選択クエリへの「引数」として。 実行される完全なステートメントは、id = 10の従業員からの給与を選択することです。 データベースの従業員をドロップします。

これは、任意のシェルの実行または任意のファイルの読み取り/書き込みを許可する一部のデータベースタイプでは特に危険です。 現在、データベースのセキュリティホールを悪用することにより、攻撃者はシステムに完全にアクセスできます。

リトルボビーのお母さんが言っているように、すべてのソフトウェアがデータベース入力を適切にサニタイズして、SQLインジェクション攻撃を阻止することは素晴らしいことです。 入力のサニタイズに加えて、攻撃の重大度を制限する方法は他にもたくさんあります。データベース特権の制限、未使用のストアドプロシージャの削除、不要な機能の無効化などです。残念ながら、データベースに対するクエリを発行するコードがたくさんあります。 多くのデータベース構成があり、それらすべてを監査して修正したことを確認するのは非常に困難です。 必要なのは、攻撃者がデータベースに対して任意のsqlを実行し始めるための脆弱性です。

悪意のあるコードをすべて修正するつもりがないと仮定した場合、悪意のある意図からデータベースをどのように保護しますか? セキュリティを提供するもう1つの方法は、攻撃者が脆弱性を悪用した後に行うことを探して攻撃を検出することです。

  • 機密ファイルの読み取り
  • システムファイルを削除または置換して、サーバーの構成を変更する
  • シェルのようなプログラムを生成する
  • リバースシェルとして機能し、ネットワーク接続を開く新しいスクリプトをWebサーバールートの下にインストールする

これらのタイプの動作を検出することが、sysdig falcoを作った理由です。

Sysdig Falcoがどのように役立つか

Sysdig falcoは、アプリケーション内の異常なアクティビティを検出するために設計されたオープンソースのビヘイビアアクティビティモニタです。 Falcoは、アプリケーションが実行するシステムコールに基づいて疑わしい動作を識別する一連のルールによって識別します。 Falcoは、コンテナ化、仮想化、およびベアメタルのLinux展開で動作します。 Falcoルールの例を次に示します。

- macro: bin_dir
  condition: fd.directory in (/bin, /sbin, /usr/bin, /usr/sbin)


- macro: open_write
  condition: (evt.type=open or evt.type=openat) and evt.is_open_write=true and fd.typechar='f'


- list: package_mgmt_binaries
  items: [dpkg, dpkg-preconfigu, rpm, rpmkey, yum, frontend]


- rule: write_binary_dir
  desc: an attempt to write to any file below a set of binary directories
  condition: bin_dir and evt.dir = < and open_write and not package_mgmt_procs
  output: "File below a known binary directory opened for writing (user=%user.name command=%proc.cmdline file=%fd.name)"
  priority: WARNING 

ルールwrite_binary_dirは、既知のバイナリディレクトリの下のファイルへの予期しない書き込みを検出します。 条件フィールドは、すべてのシステムコールを調べ、疑わしいアクティビティを表すシステムコールを識別するsysdigフィルタリング式です。 これは、システムコールとその引数に限定されません。 Sysdigライブラリは、低レベルのシステムコール情報とシステム状態をイベントに構築し、アプリケーションの状態を詳細に表示します。 Sysdigは、mesos、kubernetes、docker swarmなどのコンテナおよびオーケストレーションフレームワークもサポートしています。

イベントがルールの条件に一致すると、falcoはルールの出力フィールドと優先度フィールドを使用して通知を送信します。

この例では、falcoのルールセットがsysdigフィルタリング式の上に提供するいくつかの追加機能も示しています。 Falcoのルールセットには、マクロとリストを含めることもできます。これは、読みやすいように他のルールに含めることができる再利用可能なスニペットです。

次に、SQLインジェクション攻撃を実行した後、攻撃者の悪意のあるアクティビティを検出するためにfalcoのルールを使用する方法を示します。 これらのルールのほとんどは、0.3.0ルールセットからそのまま使用されます。

悪意のある振る舞いを検出

機密ファイルの読み取り

攻撃者が行う可能性のあることの1つは、/etc/shadowなどの機密ファイルを読み取って、ユーザー/パスワードリストなどを取得しようとすることです。 この動作を検出するFalcoルールは次のとおりです。

- macro: sensitive_files
  condition: fd.name startswith /etc and (fd.name in (/etc/shadow, /etc/sudoers, /etc/pam.conf) or fd.directory in (/etc/sudoers.d, /etc/pam.d))


- macro: server_procs
  condition: proc.name in (http_server_binaries, db_server_binaries, docker_binaries, sshd)


- macro: proc_is_new
  condition: proc.duration <= 5000000000


- rule: read_sensitive_file_untrusted
  desc: an attempt to read any sensitive file (e.g. files containing user/password/authentication information). Exceptions are made for known trusted programs.
  condition: sensitive_files and open_read and not proc.name in (user_mgmt_binaries, userexec_binaries, package_mgmt_binaries, cron_binaries, iptables, ps, lsb_release, check-new-relea, dumpe2fs, accounts-daemon, bash, sshd) and not proc.cmdline contains /usr/bin/mandb
  output: "Sensitive file opened for reading by non-trusted program (user=%user.name command=%proc.cmdline file=%fd.name)"
  priority: WARNING


- rule: read_sensitive_file_trusted_after_startup
  desc: an attempt to read any sensitive file (e.g. files containing user/password/authentication information) by a trusted program after startup. Trusted programs might read these files at startup to load initial state, but not afterwards.
  condition: sensitive_files and open_read and server_procs and not proc_is_new and proc.name!="sshd"
  output: "Sensitive file opened for reading by trusted program after startup (user=%user.name command=%proc.cmdline file=%fd.name)"
  priority: WARNING 

実際には2つのルールバリアントがあります。 1つ目は、既知の信頼できるプログラムを除外して、機密ファイルにアクセスしようとする試みを検出します。 2番目は、構成可能な初期期間(proc_is_new/proc.duration <= 5000000000 macro)の後に、プログラムによる機密ファイルへのアクセスの試みを検出します。 これは、データベースを含む一部のプログラムで役立ちます。これらのプログラムは、ユーザー/アカウント情報を読み込んでいる間は起動時にファイルを読み取りますが、起動して実行するとアクセスしない傾向があります。

システムファイルの削除/置き換え

攻撃者は、/etc/, etcのファイルなどのシステムファイルを上書きして、サーバーの構成を変更しようとする場合もあります。 Falcoでこれを検出する方法は次のとおりです。

- macro: write_etc_common
  condition: >
    etc_dir and evt.dir = < and open_write
    and not proc.name in (shadowutils_binaries, sysdigcloud_binaries, package_mgmt_binaries, ssl_mgmt_binaries, dhcp_binaries, ldconfig.real)
    and not proc.pname in (sysdigcloud_binaries)
    and not fd.directory in (/etc/cassandra, /etc/ssl/certs/java)


- rule: write_etc
  desc: an attempt to write to any file below /etc, not in a pipe installer session
  condition: write_etc_common and not proc.sname=fbash
  output: "File below /etc opened for writing (user=%user.name command=%proc.cmdline file=%fd.name)"
  priority: WARNING 

マクロwrite_etc_commonはほとんどの作業を行い、信頼できないプログラムによって/ etc/の下にあるファイルを開こうとする試みを探します。 write_etcは、そのマクロとproc.name = fbashを使用します。これは、インストールセッションを識別する方法です。 パイプインストーラーとインストールセッションの説明については、ブログ投稿を参照してください。

シェルを生成する

攻撃者は、脆弱性を悪用した後にシェルを生成しようとする場合もあります。 Falcoがこの動作を検出する方法を次に示します。

- macro: spawned_process
  condition: evt.type = execve and evt.dir=<


- rule: run_shell_untrusted
  desc: an attempt to spawn a shell by a non-shell program. Exceptions are made for trusted binaries.
  condition: spawned_process and not container and proc.name = bash and proc.pname exists and not proc.pname in (cron_binaries, bash, sshd, sudo, docker, su, tmux, screen, emacs, systemd, login, flock, fbash, nginx, monit, supervisord, dragent)
  output: "Shell spawned by untrusted binary (user=%user.name shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)"
  priority: WARNING 

ルールは、親プログラムがシェルを生成することがわかっているプログラムのセットにない場合に、プログラムbashを実行しようとする試みを探します。データベースプログラムはリストにないため、誰かが抜け穴を利用してシェルを呼び出すと、Falcoはそれを検出します。

ネットワーク接続を開く

攻撃者は、攻撃者の「自分のサーバ」へのネットワーク接続を開くソフトウェアをインストールすることもあります。 彼らはいくつかの方法でこれを行うことができます:

  • split、statなどの一般的なバイナリプログラムを、リバースシェルとして機能するまったく異なるプログラムで上書きする場合があります。 これにより、リバースシェルの検出が困難になります。
  • php/perlスクリプトをWebサーバーのルートディレクトリの下にインストールし、Webサーバーのスクリプトモジュール(mod_php、mod_perlなど)を使用してスクリプトを呼び出す場合があります。

この動作を検出できるFalcoルールは次のとおりです。

- macro: inbound
  condition: ((evt.type=listen and evt.dir=>) or (evt.type=accept and evt.dir=<))


- macro: outbound
  condition: evt.type=connect and evt.dir=< and (fd.typechar=4 or fd.typechar=6)


- macro: system_procs
  condition: proc.name in (coreutils_binaries, user_mgmt_binaries)


- rule: system_procs_network_activity
  desc: any network activity performed by system binaries that are not expected to send or receive any network traffic
  condition: (fd.sockfamily = ip and system_procs) and (inbound or outbound)
  output: "Known system binary sent/received network traffic (user=%user.name command=%proc.cmdline connection=%fd.name)"
  priority: WARNING


- rule: parent_apache_network_activity
  desc: any network activity performed by a program that is a child of apache. Apache might run php/perl scripts via mod_php/mod_perl, but the scripts should not make network connections.
  condition: fd.sockfamily = ip and (inbound or outbound) and proc.aname=apache
  output: "Known system binary sent/received network traffic (user=%user.name command=%proc.cmdline connection=%fd.name)"
  priority: WARNING 

最初のルールは、coreutils/ユーザー管理バイナリによるインバウンドまたはアウトバウンドのネットワーク接続を開こうとする試みを検出します。 これらのプログラムは、ネットワークアクティビティを実行することは想定されていません。したがって、実行された場合は、改ざんされていることを示しています。

2番目のルールはmod_php/mod_perlの不正使用を探し、祖先ツリーのどこかにapacheがあるプログラム(proc.aname = apache part)によるネットワーク接続を検出します。

まとめ

SQLインジェクション攻撃により、攻撃者がターゲットシステムへの特権アクセスを取得できることを示しました。 最悪の場合、これには任意のファイルの読み取り/書き込みおよび新しいプログラムの生成が含まれます。

Falcoを使用して、脆弱性を悪用した後に攻撃者が実行するアクティビティを検出することにより、これらの攻撃に対する追加の保護層を提供する方法を示しました。

願わくは、このブログによりあなたがFalcoに興奮することを願っています。 Falcoをダウンロードして、使ってみてください!

ところで、私たちは常にルールセットへの新しいコントリビューションを期待しています。 コミュニティに役立つルールを追加してください!

Sysdigに関するお問い合わせはこちらから

最近の投稿

カテゴリー

アーカイブ

ご質問・お問い合わせはこちら

top