【プログラム】コンパイルされたらもう分からん。ソースコードの中にトロイの木馬が仕込む方法とは [896590257]
■ このスレッドは過去ログ倉庫に格納されています
見えない脆弱性をソースコードに埋め込む、プログラマーも欺く「トロイのソース」
2021.11.17 日経クロステック
プログラムに埋め込まれた脆弱性やマルウエア(コンピューターウイルス)などを見つける有効な手段の1つが、そのソースコードを丹念に調べること。
スキルのある開発者なら、ソースコードを調べることで異常に気づける。
だが、そういった開発者の目を欺く手法が発表された。ソースコードに細工を施せば、テキストエディターなどで表示されるソースコードの「見た目」を
変えられるというのだ。言い方を変えれば、目に見えない脆弱性を埋め込めるという。そんなことが可能なのだろうか。
■「トロイの木馬」のソースコード版
この新手法は、英ケンブリッジ大学の研究者らが2021年11月1日(現地時間)に発表した。「Trojan Source」と名付けられた。「Trojan Horse:トロイの木馬」にちなんだ命名だと考えられる。
ソースコードに仕込んだ脆弱性を、どのようにして開発者に気づかれないようにするのか。答えは単純。
■Unicodeを使う
「Unicodeの制御文字」を使ってソースコードの見た目を変えるのだ。Unicodeとは文字コードの一種。文字を扱うプログラムのほとんどが対応している。制御文字とは、ディスプレーやプリンター、
通信装置などに特別な動作をさせるための文字である。「文字」といっても、標準ではディスプレーなどには表示されない。そのほか1文字単位ではなくブロック単位で文字の表示を
入れ替える制御文字などもある。こういった制御文字をうまく組み合わせれば、脆弱性が埋め込まれたソースコードを、問題のないソースコードに見せかけることが可能になる。
■コメントや変数に忍ばせる
一般的なプログラミング言語では、ソースコードの任意の場所に制御文字を挿入できない。コンパイラーによる変換時(コンパイル時)にエラーが発生する。ただし、コメントと文字列は例外だ。
これらはコンパイラーによって解釈されないので、制御文字を含む任意の文字を入れられる。そこで、コメントや文字列に制御文字を入れることで、それらをソースコードの一部に見せかけたり、
ソースコードがコメントアウトされているように見せかけたりする。
https://xtech.nikkei.com/atcl/nxt/column/18/00676/111300092/
>>1の続き
https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00676/111300092/c1.png
C言語によるTrojan Sourceの例。これは実際のソースコード。色が付いているのが制御文字。
制御文字はすべてコメントに収められている。
https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00676/111300092/c2.png
上のソースコードをテキストエディターなどで表示した例。制御文字により、実際には
コメント中にある条件文「if ( isAdmin )」がコードに含まれているように見える。 詳しくねーんだけどさ、目的なんなの?ウィルスの。愉快犯? 10 INPUT A
20 INPUT B
30 C=A+B
40 END Ken ThompsonのReflections on Trusting Trustを読め
日本語の解説も多い ソースコードにトロイやマルウェアを入れるなんて開発者ぐらいしか出来んと思うけどw ロシア製のクラック版とかにつかわれてるんだろうな
つまり割るなってことだ 逆アセンブラして読むに決まってるだろ。
ナメちゃいかんよw >>21
昔はWinのクラックバージョンとかに仕込まれまくってたんだろうな >>19
パチンコとか銀行関係に仕込めりゃ儲かるやん 昔、RMS尊師がCのコンパイラに入れとけば誰にもバレないとドヤ顔で言ってたぞ >>7
10 INPUT A
20 INPUT B
30 PRINT C
40 END >>25
有名な話だけど
昔、客の口座の計算されて消滅する端数を
全部自分の口座に送金するプログラム仕込んだ奴が居た 複雑なことする必要はなくてちょっとセキュリティホールを作っとけばいいんだろうな。 コンパイラそのものがトロイの木馬を埋め込む時代が来る >>2
こんな怪しいコメントレビューとおんねえわw
どんだけ低レベルな現場だよ 逆アセすればいいじゃん。そのプログラムで使わない
ような関数呼んでたり、ファイルパスの文字列あったり
したら怪しいわけで(´・ω・`) いまどきはGithubから怪しいコード引っ張ってきて
動いたー、とかやってるビギナーがほとんどだろ。
いくらでも混入のリスクはある。 テキストエディタが制御文字に対応し過ぎなのがまずいんかね
プログラミング用のエディタなら制御文字なんてその機能は無視して絵や記号で表示するだけにすればいいのに void *po = null;
if (po == null) gaxtu(); 結局ソースの解析しないとわからんのよ。
うだうだ言う前に怪しいソフトは使わないのが吉。 新卒で応募して落ちたがまあその後潰れたし良かったかも >>37
俺読めるけど絶対に読みたくない。東京から
伊豆までチャリで行けって言われてるようなもん。 >>40
改行とタブ位は処理してくれないと編集で死ぬ 確かにコメントなら楽に仕込めるね
>>31
そんななら笑って許せる
怖いのは情報の流出
安全にかかわる 第2リール停止後にレバー逆押し3回やってからマックスベット叩いて第3リール叩くと有利区間ランプ消えるで 組み込みのitronとか
ほぼブラックボックス的に使うミドルウェア
この辺りに仕込まれてたらIoT関連死亡だな ガチでこういうセキュリティ仕事にしてたが
今のアセンブラってもう読めねえ
ebxまでで限界
rbxにxmmだのもうアセンブラを生で読むの無理ゲーすぎ
AIのパターンマッチでバイナリから怪しいバイト列とかを検出するのがあるから最近じゃそういうので検出するしかないと思うわ
そもそも制御コード入れてもcui系のエディタだと^[[何とかにエスケープされるとおもうが設定次第なんかな
最近のelectronベースのエディタは騙せそうね >>55
そこまで行くとOSやBIOSに組み込まない限りOSが起動時にクリアしてしまうから出来んのじゃないかな、今は。 >>56
OSやBIOSに組み込まれてる
某国製PC… だからビルドしないで動くパイロンとかに移行しようとしてるのに
今のシステムにこだわる奴多いんだよな IDEのエディタは制御コードを無視するしかないかな? >>37
常識的に考えてやる意味がないw
苦行マゾの類いでも手を出さない ナジャリくらいの玄人になると、マシン語見ただけでだいたいわかるらしいよね? >>60
1枚目の画像みたく制御文字も表示すれば解決 具体的な経路はどうするの?
パッケージライブラリとかに仕込むの? 「トロイの木馬が仕込む」
素で日本語文法分かってなさそうな誤字なのが怖い 機械語を話せるサイボーグプログラマなら判別できるんじゃねえか? >>29
サラミ法
映画のスーパーマン3でもやってた ミネソタ大が実験で意図的に、脆弱性含んだパッチをlinuxカーネルコミュニティに送付したらバレて
コミュニティからbanとか今年あったからなぁ。
composerやらnpmやらupdateで降ってきたパッケージに難読化したコード仕込まれてても
こんなん気付かんよなぁと毎度思う。 >>37
昔読んだ小説にアセンブラで直接プログラミングするキャラいたな
大天才って設定だったから普通の人間には無理だろな >>13
大昔は出来たそうだが、今じゃOSが弾くだろ >>78
組み込み制御だけど、今でも初期化モジュールはアセンブラだよ。
マイコンが立ち上がった直後はC言語がまだ使えないんで、アセンブラで書くしかない。
クロックやデバイスやスタックなどを一通り設定すると、コンパイラメーカーが提供してるC言語の初期化モジュールをコールできるんで、その後はCで書ける。
昨今はCで書いた方が速度的に早いんで、割り込み処理であってもCで書いてる。
アセンブラと言っても初期化処理では凝った処理は無いし、過去資産を修正するだけだけどね。 >>77
コードレビューもそうだけど、よくわからないコードを「わからないけどいいや」で通すことは無いし、ベテランであるレビュアー(レビューする人)が理解できないコードは将来的なメンテを考慮してNGにする。
あとアセンブラが必要な処理はアセンブラでちゃんと書く。>>80
その方が異なるマイコンに移植する時が「これは使えんな」とわかりやすいw
少なくても>>2のコードがレビユーを通ることは無い。 処理追い付かない時にインラインアセンブラで書く程度の知識しか持ってないけど、逆アセンブルされたヤツは意味不明すぎる
リコンパイルしてダンプリストのコンペア取る方が現実的 >>こういった制御文字をうまく組み合わせれば
それが難しいんだよ >>84
例えデバッグコンパイルしても、レジスタフル動員して効率の良い命令選択を行い、マルチパイプラインを考慮した命令配置に入れ替えられるんで、ヒトには理解しにくいコードになりますね。
最適化レベル上げるともうわからないw >>13
8bitの時代は1バイトずらすと全然違う意味のコードになるようにしといて逆アセンブラをだますとか色んなテクニックがあったな マシン語ネイティブの俺ならダンプリストで解析可能だが?
なんならチェックサムだけでもうっすらわかるが? >>90
もうゼッパチの時代じゃないですよ、おじいちゃん もう全部のアプリをGithubで自前ビルドさせりゃええわ
ちょうどVisualStudio2022も出たしな >>92
レビユーないなら堂々と仕込めばいいワケで、レビユーはやるけど「わかるコードは指摘するけど、わからないコードはまあいいや、オッケー」で通る会社だろなwww >>19
日経だぞw
あのwilltyですら騙されて記事にする程度の技術知識しかない無能系が記者やってんだぞ >>105
昔の環境しか知らんけどソースは呼び出す一行だけで
ウイルスのオブジェをメイクでリンクするくらいだよね >>29
それのソースは見たことないけど、自分の口座番号が書いてあるはずだからそれを発見されたら逮捕されると
わかってたはず。それを隠す特殊な方法使ったとしたらけっこう賢い。 >>78
えーとね、アセンブラで書くと言っても当然書きやすいように工夫するんだよ。
マクロ使って書くとアセンブラでもCみたいな制御構文が書けるし、代入もMOVじゃなくて = で書けるようにして、
一見すると高級言語みたいなソースにすることができる。 >>105
データセクションに
.data
db ういるす
でコンパイルするって事かな >>110
>>29は結構有名な話だけど、その銀行のエンジニアである犯人は架空口座として特殊な名前(ZZZだったかな?)を作り、ここに、四捨五入で切り捨てられる額を振り込んでたんだけど、境界テストをしてたプログラマが毎回テストにかかる最終名称が「こんな名前の人いるんだ?」と不思議がったのが発端でバレた。
MMMならバレなかったかもしれないw >>114
アメリカの話で、名前欄が(適当に作ったんで)違和感あったのが発見の要因だったみたいだね。 よく分からんけどテキストエディターで開いたらコメント外になってるんなら
その時点で気がつくんじゃね? 8086 CPU のアセンブリ言語はニーモニック言語だった記憶
LB1
(処理コマンド)
LAD GR1,1,GR1
CPA GR1,N
JMI LB1
今のH8 CPU だとアセンブリ言語はC言語なんだっけな
main{}
{
int i:
for ( i=0: i<10: i++ ){
(処理コマンド)
}
} >>118
頭痛が痛い、みたいな文章になってるぞ。
無理すんな。 小一時間調べて頑張ったんや!
頭ズキズキ痛くなるのも我慢しながら! >>119
すっげえ昔に使っただけなので記憶の外なんだが、8086にLAD命令なんてあったっけ?
lbl:
mov AX,10
dec AX
jnz lbl
なイメージ iniファイルを読み込むAPI関数があることを知らなかった人が
ご丁寧にiniファイルをOpenして引数で指定した項目を読み込むプログラムを自分で作ってるのを見たときはコーヒー吹いた。 Z80ならヘキサコードを直接読み書きできる人は普通にいた。
底辺な俺でも未だに主要な命令はヘキサで読める。 >>124
暗記モード。
CDがコール命令、FEが分岐かなんかw
覚えてるのはそんくらいかwww >>124
バグ見つけるとROMを外してROMライターに読み込ませた後に新しいROMを差し、ハンドアセンブルで修正して書き込んで再テスト。
取り外したROMは紫外線を当てて消去。
なんて時代は脳内がアセンブラだったけど、組み込みと言えど、いつしかICEに慣れ、それがJTAGになった頃にはハンドラも何もかもCだな。
(アセンブラ書くのは初期化処理位) 00がnopだからROMでも取り敢えず潰せばnopになるのがパッチ当てるのに便利だった >>126
ブランクエリアの0FFhはRST 38hになるけど当時は意味がわからなかった
一種のソフトウェア割り込みでMS-DOSのint 21hみたいなものだったんだな ■ このスレッドは過去ログ倉庫に格納されています