4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BitVisorAdvent Calendar 2015

Day 23

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

Last updated at Posted at 2015-12-22

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

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

この記事では,

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

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

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

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月. スライド

  • 大山 恵弘, 河崎 雄大. "ハイパバイザ内シグネチャマッチングによるマルウェア検出", コンピュータセキュリティシンポジウム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月. 論文

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?