web-dev-qa-db-ja.com

シェルスクリプトのコードの脆弱性

コンピュータセキュリティのクラスの課題が与えられました。脆弱性を分析して特定するためのコードが与えられました。

#!/bin/sh
# Shell script to create a copy of the shadow file to the /tmp directory

echo > /tmp/shadowcopy

# allow only root access
chmod 600 /tmp/shadowcopy

# append the original file to the copy
cat /etc/shadow >> /tmp/shadowcopy

# Hint: the access permissions of a file in linux are verified when the file is opened.
# the process will keep the original permissions as long as it keeps the file open, even
# if permissions change. 

一部のクラスメートと私は、2つの別個のプロセスが/ tmp/shadowcopyを開こうとすると、このスクリプトが競合状態の脆弱性の影響を受ける可能性があると判断しました。

また、追加が始まる前に/ tmp/shadowcopyが変更された場合、コマンドインジェクションの脆弱性が発生する可能性があると考えています。

このシェルスクリプトに関する私たちの仮定は正しいですか?または、スクリプトが使用された場合に悪用される可能性のある重要な脆弱性を見逃していますか?

1
Alan W

Catバイナリは、排他的な書き込みアクセスのためにLOCK_EXを使用してflock()呼び出しを埋め込まないため、想定は正しいです。

Strace catファイルを実行して、システムコールの問題またはバイナリによる問題を確認することができます。

この問題を防ぐ方法は次のとおりです。

#!/bin/bash

set -e

(
  flock -n 200

  echo > /tmp/shadowcopy

  chmod 600 /tmp/shadowcopy

  cat /etc/shadow >> /tmp/shadowcopy
) 200>/var/lock/.mylock

また、chmodコマンドの前に誰かがtail -f/tmp/shadowcopyを発行してアクセス権を取得できるため、権限は競合状態を引き起こす可能性があります。

競合状態に関するセキュリティのベストプラクティスについてさらに読むには、fnctl()、flock()、およびstat()をご覧ください。

または、バッファを監視しているデバイスに他の誰かがいても、ハッシュにアクセスできる場合は、 https://Gist.github.com/jas-/9534117 を参照してください。

これは、実行中のプロセスからメモリをスクレイピングするための概念実証です。

3
jas-

Execiseが競合状態を検出することを目的としていることに同意しますが、エラーチェックが行われていないため(set -eは機能します)、より多くのホールが利用可能です:

なので /tmpは共有フォルダです。/tmp/shadowcopyモード666で(したがって、それを開いて書き込むことができますが、chmodはできません)。スクリプトがシャドウグループのメンバーとして実行された場合(/ etc/shadowはrootでなくても読み取ることができます)、ユーザーは完全に読み取り可能になります。

また、攻撃者は事前にファイルを作成して開くことができるため、競合状態は無限に長いことに注意してください。echochmodの間でraceを実行する必要はありません。 。

/tmp/shadowcopyはシンボリックリンクとして作成されたので、任意の名前とシャドウファイルの内容を使用してファイルを作成できます(スクリプトがrootによって実行されている場合)。サービス拒否として最も役立ちます。 ln -s /tmp/shadow /boot/vmlinuz-3.16.0-4-AMD64はカーネルを置き換えるため、マシンが起動できなくなります。

3
Ángel