電気通信大学の大山です.
BitVisorのATAドライバやAHCIドライバを改造すると,ストレージI/Oデータの監視や加工が簡単に実現できます.
マルウェア検出,不適切ワードの自動削除,設定ファイルの書き換えなど,色々な応用があります.
この記事では,
- HDDからOSに読み込むデータに対して,BitVisorが文字列マッチングにより監視する
- マッチしたら,BitVisorがその文字列を別の文字列で置き換える
という処理を実現する方法について書きます.
AHCIでHDDを使っている場合,BitVisor 1.4のahci.cのahci_copy_dmabuf関数を以下のように改造すると,それが実現できます.#if 1と#endifで囲まれた部分が追加されたコードです.
static void
ahci_copy_dmabuf (struct ahci_port *port, int cmdhdr_index, bool wr,
struct command_table *cmdtbl, u16 prdtl)
{
u8 *mybuf = port->my[cmdhdr_index].dmabuf;
u32 dba, dbau, dbc;
phys_t db_phys;
void *gbuf;
int i;
u32 remain;
ASSERT (mybuf);
remain = port->my[cmdhdr_index].dmabuflen;
if (wr) {
/* copy guest buffer to shadow buffer */
...
}
} else {
/* copy shadow buffer to guest buffer */
for (i = 0; i < prdtl; i++) {
dba = cmdtbl->prdt[i].dba;
dbau = cmdtbl->prdt[i].dbau;
dbc = (cmdtbl->prdt[i].dbc & 0x3FFFFE) + 2;
ASSERT (remain >= dbc);
remain -= dbc;
db_phys = ahci_get_phys (dba & ~1, dbau);
gbuf = mapmem_gphys (db_phys, dbc, MAPMEM_WRITE);
memcpy (gbuf, mybuf, dbc);
#if 1
{
char *keyword = "Merry Christmas";
char *new_keyword = "Meri Krushmimas";
u32 keyword_len = strlen(keyword);
u32 j;
u8* p = gbuf;
if (dbc >= 4096) {
for (j = 0; j <= dbc - keyword_len; j++) {
if (p[j] == keyword[0] && p[j+1] == keyword[1]) {
if (memcmp(p + j, keyword, keyword_len) == 0) {
printf("Keyword \"%s\" found! I replace it with \"%s\".\n", keyword, new_keyword);
memcpy(p + j, new_keyword, keyword_len);
}
}
}
}
}
#endif
mybuf += dbc;
unmapmem (gbuf, dbc);
}
}
ASSERT (remain == 0);
}
keywordが文字列マッチング対象のキーワード,new_keywordがそれを置換するキーワードです.new_keywordはkeywordよりも短い文字列にします.
元々は↓このように実行されていたものが
$ cat message.txt
I wish you a Merry Christmas!
このBitVisorがOSの下で動いているときは↓このように実行されます.
$ cat message.txt
I wish you a Meri Krushmimas!
多分,ブラウザなどの大きいアプリケーションの表示にも影響を与えられるはずです.
ストレージからメモリに載せるタイミングで置換しているので,ストレージ上のデータは変わりません.
このコードではkeywordの最初の2文字だけを先にチェックしてmemcmpの呼び出し回数を減らしています.エラーチェックはかなり省いてあります.
AHCIではなくATAを使っている場合には,ata_bm.cのata_copy_shadow_bufを改造すれば,うまくいくと思います.
ストレージI/Oデータの監視や加工にあたっては,BitVisorのATAドライバを有効にする必要があるので,defconfigファイルのataの部分を1にしたり,config.shでATA_DRIVERを有効にする必要が,多分あります.
資料や発表
BitVisorによるI/Oデータの文字列マッチングについては以下の発表があります.
-
河崎 雄大, 大山 恵弘. "BitVisorのためのマルウェアの検出機能", BitVisor Summit, 東京, 2012年12月. スライド
-
大山 恵弘, 河崎 雄大. "ハイパバイザ内シグネチャマッチングによるマルウェア検出", コンピュータセキュリティシンポジウム2012(CSS2012),マルウェア対策研究人材育成ワークショップ2012(MWS2012), pages 122-129, 松江, 2012年10月. 論文
-
河崎 雄大, 大山 恵弘. "VMMを用いたマルウェア検出システムのためのシグネチャデータ更新機能とメモリデータ検査機能", 情報処理学会2012年並列/分散/協調処理に関する『鳥取』サマー・ワークショップ(SWoPP鳥取2012), 7 pages, 鳥取, 2012年8月. 論文
-
Yoshihiro Oyama, Tran Truong Duc Giang, Yosuke Chubachi, Takahiro Shinagawa, Kazuhiko Kato. "Detecting Malware Signatures in a Thin Hypervisor", In Proceedings of the 27th Annual ACM Symposium on Applied Computing (SAC 2012), pages 1807-1814, Riva del Garda, Italy, March 2012. Paper
-
Tran Truong Duc Giang, 大山 恵弘, 忠鉢 洋輔, 品川 高廣, 加藤 和彦. "準パススルー型仮想マシンモニタへのマルウェア検出機能の拡張", 第22回 コンピュータシステム・シンポジウム (ComSys 2010), pages 13-20, 大阪大学 中之島センター, 2010年11月.
-
Tran Truong Duc Giang, 大山 恵弘, 忠鉢 洋輔, 品川 高廣, 加藤 和彦. "準パススルー型VMMのマルウェア検出機能による拡張", 情報処理学会 第142回マルチメディア通信と分散処理・第48回コンピュータセキュリティ合同研究発表会, 仙台, 2010年3月. 論文