ATA/AHCIドライバの改造によるお手軽データ監視と加工

電気通信大学の大山です．

BitVisorのATAドライバやAHCIドライバを改造すると，ストレージI/Oデータの監視や加工が簡単に実現できます．
マルウェア検出，不適切ワードの自動削除，設定ファイルの書き換えなど，色々な応用があります．

この記事では，

- HDDからOSに読み込むデータに対して，BitVisorが文字列マッチングにより監視する
- マッチしたら，BitVisorがその文字列を別の文字列で置き換える

という処理を実現する方法について書きます．

AHCIでHDDを使っている場合，BitVisor 1.4のahci.cのahci_copy_dmabuf関数を以下のように改造すると，それが実現できます．#if 1と#endifで囲まれた部分が追加されたコードです．

```c:ahci.c
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月. [スライド](http://www.bitvisor.org/summit/slides/BitVisor-Summit-08-kawasaki.pdf)

- 大山 恵弘, 河崎 雄大.  "ハイパバイザ内シグネチャマッチングによるマルウェア検出", コンピュータセキュリティシンポジウム2012（CSS2012），マルウェア対策研究人材育成ワークショップ2012（MWS2012）, pages 122-129, 松江, 2012年10月. [論文](http://www.iwsec.org/mws/2012/manuscript/1A2-3.pdf)

- 河崎 雄大, 大山 恵弘.  "VMMを用いたマルウェア検出システムのためのシグネチャデータ更新機能とメモリデータ検査機能", 情報処理学会2012年並列／分散／協調処理に関する『鳥取』サマー・ワークショップ（SWoPP鳥取2012）, 7 pages, 鳥取, 2012年8月. [論文](http://id.nii.ac.jp/1001/00083238/)

- 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](http://dx.doi.org/10.1145/2245276.2232070)

- Tran Truong Duc Giang, 大山 恵弘, 忠鉢 洋輔, 品川 高廣, 加藤 和彦.  "準パススルー型仮想マシンモニタへのマルウェア検出機能の拡張", 第22回 コンピュータシステム・シンポジウム (ComSys 2010), pages 13-20, 大阪大学 中之島センター, 2010年11月.

- Tran Truong Duc Giang, 大山 恵弘, 忠鉢 洋輔, 品川 高廣, 加藤 和彦.  "準パススルー型VMMのマルウェア検出機能による拡張", 情報処理学会 第142回マルチメディア通信と分散処理・第48回コンピュータセキュリティ合同研究発表会, 仙台, 2010年3月. [論文](http://id.nii.ac.jp/1001/00068208/)