TL;DR

systemd-detect-virtの実装を読め

仮想化検知

VMMによって挙動が変わるようなソフトウェアを書く/使う時,検知できると嬉しい.

agenda

about

基本的には特有のリソースから検知する

ここからはそのリソースとそこから判断できる仮想化技術についてまとめる

Detect VM

DMI

Desktop Management Interface

/sys/class/dmi/id/product_name
/sys/class/dmi/id/sys_vendor
/sys/class/dmi/id/board_vendor
/sys/class/dmi/id/bios_vendor

これらのファイルにベンダーの情報が含まれていたりする

ここから検知できるのは以下のhypervisor

UML

User Mode Linux

/proc/cpuinfoを見ると,

vendor_idUser Mode Linuxが設定されている

cpuid

cpuid命令からわかる

hypervisorの情報も含まれている

検知できるのは以下のhypervisor

/proc/xen

Xenには/proc/xenが存在する

/sys/hypervisor/type

Xenは/sys/hypervisor/typexenになっている

device tree

いくつかのhypervisorは/proc/device-tree以下のファイルで検知できる

PowerVMには

/proc/device-tree/ibm,partition-name
/proc/device-tree/hmc-managed?
/proc/device-tree/chosen/qemu,graphic-width

が存在する

QEMUには

/proc/device-tree以下にfw-confが名前に含まれるようなファイルが存在する

/proc/device-tree/hypervisor/compatibleの内容によって

を検知できる

/proc/sysinfo

z/VMは/proc/sysinfoVM00 Control Programz/VMになっている

Detect Container

コンテナも主に特定のファイルで検知できる

OpenVZ

/proc/vzとか/proc/bcがあったりする

WSL

/proc/sys/kernel/osreleaseMicrosoftとかWSLって書いてある

PRoot

/proc/self/statusのTracerPidが0でなく,/proc/{TracerPid}/commprootで始まっているとPRoot

container-manager

/run/systemd/container-managerociだった時,

/run/.containerenvがあるとPodman

/.dockerenvがあるとDocker

/run/systemd/container

や,/proc/1/environの内容で

を検知できる

impl

基本的にはsystemd-detect-virtの再実装.

Rustで実装してみたやつgithub.com/n01e0/detect-virt

testができない:cry:

参考

systemd-detect-virt


この記事はIPFactory Advent Calendar 2021の12/02分です.

IPFactoryというサークルについては,こちらをご覧ください.

昨日はn01e0によるDocker image injectionでした.

明日はn01e0によるDetecting fileless execution in linuxです.