web-dev-qa-db-ja.com

/ dev / memのアクセス許可

/dev/memに関する一連の質問があります:

  1. ネット上の多くの記事は、/dev/mem"Physical RAM"へのゲートウェイとして参照しているようです。しかし、私が正しければ、/dev/memは、RAMだけでなく多くのHW周辺機器の制御レジスタを含む可能性のあるプロセッサの"Physical Address Space"へのゲートウェイですか?間違っていたら訂正してください!

  2. 攻撃者が/dev/memを悪用してカーネルメモリを変更するのを防ぐために、フラグCONFIG_STRICT_DEVMEMを有効にして、ユーザーアプリが1MBを超える物理アドレス空間にアクセスできないようにする必要があります。 PC(Ubuntu)の設定ファイルを確認したところ、CONFIG_STRICT_DEVMEM = yでした。そして、1 MBを超える物理メモリに読み込もうとするプログラムを作成し、読み取ることができました。セグメンテーション違反やOperation NOT Permittedエラーはありません。これはどのように可能ですか?

私のプログラムは大まかに次のようになります。

fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);
19
Pavan Manjunath
  1. はい、その通りです。/dev/memを使用すると、RAM以外のメモリマップドIOを含む任意の物理アドレスをマップできます。これは、カーネルドライバーを作成せずに、ハードウェアデバイスにアクセスするための迅速で汚いハッキングに役立つ可能性があります。

  2. CONFIG_STRICT_DEVMEMは、カーネルが/ dev/memのアドレスを_Arch/x86/mm/init.c_のdevmem_is_allowed()でチェックし、コメントで次のように説明しています。

    _* On x86, access has to be given to the first megabyte of ram because that area
    * contains bios code and data regions used by X and dosemu and similar apps.
    * Access has to be given to non-kernel-ram areas as well, these contain the PCI
    * mmio resources as well as potential bios/acpi data regions.
    _

    bIOSは通常IOメモリを4GBのすぐ下に配置するため、アドレス_0xFFFF0000_はRAM以外である可能性が非常に高いため、STRICT_DEVMEMを使用してもマップできます。

14
Roland

次の結果は何ですか?

cat /dev/mem | wc

私は得る:

cat: /dev/mem: Operation not permitted
   1908   11791 1048576

だから私にとっては1MBで止まります。

Catはmmapではなくopenを使用するため、同じテストではないことに注意してください。

1MBを超えて読んでいますか?

3
linuts