/dev/mem
に関する一連の質問があります:
ネット上の多くの記事は、/dev/mem
を"Physical RAM"
へのゲートウェイとして参照しているようです。しかし、私が正しければ、/dev/mem
は、RAMだけでなく多くのHW周辺機器の制御レジスタを含む可能性のあるプロセッサの"Physical Address Space"
へのゲートウェイですか?間違っていたら訂正してください!
攻撃者が/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);
はい、その通りです。/dev/memを使用すると、RAM以外のメモリマップドIOを含む任意の物理アドレスをマップできます。これは、カーネルドライバーを作成せずに、ハードウェアデバイスにアクセスするための迅速で汚いハッキングに役立つ可能性があります。
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を使用してもマップできます。
次の結果は何ですか?
cat /dev/mem | wc
私は得る:
cat: /dev/mem: Operation not permitted
1908 11791 1048576
だから私にとっては1MBで止まります。
Catはmmapではなくopenを使用するため、同じテストではないことに注意してください。
1MBを超えて読んでいますか?