Как да идентифицирате, че работите под VM?

Има ли начин да идентифицирате от VM, че вашият код се изпълнява във VM?

Предполагам, че има повече или по-малко лесни начини за идентифициране на конкретни VM системи, особено ако VM има инсталирани разширения на доставчика (като например за VirtualBox или VMWare). Но има ли общ начин да идентифицирате, че не работите директно на процесора?


person Wilson    schedule 02.09.2008    source източник
comment
Търсите ли теоретичен отговор (т.е. документ или алгоритъм, изисква се внедряване, предоставящ механизъм, предназначен да защити срещу малко вероятен клас атака) или практически такъв (т.е. работещ код, предназначен да обработва обичайни случаи, които не са злонамерени)?   -  person Charles Duffy    schedule 25.09.2008
comment
Това, което правите е, че имате малко нещо, което носите със себе си през цялото време и което не позволявате на никой друг да докосне. И ако се чувства добре и се държи правилно, тогава не работите във VM. (Не можах да устоя. Съжалявам.)   -  person Zarkonnen    schedule 30.07.2010


Отговори (12)


Голяма част от изследванията по въпроса са посветени на откриването на така наречените атаки „синьо хапче“, тоест злонамерен хипервизор, който активно се опитва да избегне откриването.

Класическият трик за откриване на VM е да се попълни ITLB, да се изпълни инструкция, която трябва да бъде виртуализирана (което задължително изчиства такова състояние на процесора, когато даде контрол на хипервайзора), след което да се изпълни още малко код, за открива дали ITLB все още е попълнен. Първата статия за него се намира тук и доста колоритно обяснение от блог на изследовател и алтернативен Връзка на Wayback Machine към статията в блога (счупени изображения).

Изводът от дискусиите по този въпрос е, че винаги има начин да се открие злонамерен хипервизор и е много по-лесно да се открие такъв, който не се опитва да се скрие.

person JawnV6    schedule 02.09.2008
comment
Не съм сигурен, че даденият подход ще работи с хостове, използващи NPT/EPT. - person Charles Duffy; 24.09.2008


По-емпиричен подход е да се провери за известни драйвери на VM устройство. Можете да пишете WMI заявки, за да намерите, да речем, адаптера на дисплея на VMware, дисковото устройство, мрежовия адаптер и т.н. Това би било подходящо, ако знаете, че трябва да се тревожите само за известните типове хостове на VM във вашата среда. Ето пример за правене на това в Perl, който може да бъде пренесен на езика по ваш избор.

person spoulson    schedule 02.09.2008
comment
моя компютър -› свойства -› хардуер -› мениджър на устройства погледнете адаптера на дисплея - обикновено ще видите нещо за microsoft VM или нещо за VMWare ... - person thedrs; 31.05.2009
comment
Системите за виртуализация могат и наистина емулират реален хардуер (дори ако често е стар/остарял хардуер; говорейки специално за видео драйверите, емулацията на Matrox е често срещана, но вече почти никога не се среща на десктоп – но техните чипсети се използват и на сървърни чипсети с KVM отдалечено, така че те могат да се случат и в невиртуализирани ситуации) или дори могат да направят PCI passthrough, за да осигурят пълен контрол на VM върху истинска видеокарта. (Някои NIC от висок клас имат множество PCI крайни точки, което позволява на VM да се предава пълен контрол върху подмножество от реална, физическа мрежова карта). - person Charles Duffy; 01.06.2018

Зависи какво търсите:

  • Ако виртуалната машина не се крие от вас нарочно, можете да използвате известна кука. Като търсене на драйвери на VmWare или наличие на определени низове в паметта или някои други сигнални знаци.

  • Ако виртуалната машина наистина иска да правите специални неща за нея, тя ще има някаква очевидна кука, като промяна на идентификатора на процесора или добавяне на някои специални регистри, до които имате достъп, за да го откриете. Или е специално устройство в известно място в паметта (ако приемем, че можете да получите необработен достъп до пространството на физическата памет на вашия свят). Имайте предвид, че съвременните машинни конструкции като IBM Power6 и Sun UltraSparc T1/T2 са проектирани ВИНАГИ да работят с хипервизор и никога директно върху необработен хардуер. Интерфейсът към „хардуера“, който използва операционната система, всъщност е интерфейсът на софтуерния слой на хипервайзор, без начин да го заобиколите. В този случай откриването е тривиално, тъй като е постоянно „да“. Това е вероятната бъдеща посока за всички компютърни системи, които могат да си позволят режийните разходи, погледнете поддръжката в последните проекти като чипа Freescale QorIQ P4080 например (www.freescale.com/qoriq).

  • Ако виртуалната машина умишлено се опитва да се скрие и вие преследвате нейното присъствие, това е игра на котка и мишка, при която смущението във времето и различният профил на производителност на виртуална машина почти винаги ще го издадат. Очевидно това зависи от това как е внедрена виртуалната машина и колко хардуерна поддръжка има в архитектурата (мисля, че мейнфреймът zSeries е много по-добър в скриването на присъствието на виртуална машина или стек от виртуални машини под вашата конкретна операционна система, отколкото обикновен x86 машината е например). Вижте http://jakob.engbloms.se/archives/97 за някои дискусии по тази тема. Възможно е да се опитате да се скриете като виртуална машина, но е много вероятно откриването винаги да печели, ако се опита достатъчно усилено.

person jakobengblom2    schedule 27.09.2008

Веднъж попаднах на кодов фрагмент за асемблиране, който ви казва дали сте във виртуална машина... Потърсих в Google, но не можах да намеря оригиналната статия.

Все пак открих това: Открийте дали програмата ви работи във виртуална машина .

Дано помогне.

person Giovanni Galbo    schedule 02.09.2008
comment
Мислите за подхода Red Pill или No Pill. Тази техника вече не работи. (И може да се твърди, че не работи и през 2004 г., въпреки че многопроцесорните и многоядрените системи бяха по-малко разпространени.) Вижте charette.no-ip.com:81/programming/2009-12-30_Virtualization/ - person Stéphane; 02.01.2010

В повечето случаи не трябва да се опитвате. Не трябва да ви интересува дали някой изпълнява вашия код във виртуална машина, освен в няколко специфични случая.

Ако трябва, в Linux най-често срещаният начин е да погледнете /sys/devices/virtual/dmi/id/product_name, което ще посочи името на лаптопа/дънната платка на повечето реални системи и хипервайзора на повечето виртуални системи. dmidecode | grep Product е друг често срещан метод, но мисля, че изисква root достъп.

person wvdschel    schedule 02.09.2008

Ето едно (java + windows) решение за идентифициране дали основната машина е физическа или виртуална.

Примери за виртуални машини:

Производител

  • Xen
  • Корпорация Майкрософт
  • innotek GmbH
  • червена шапка
  • VMware, Inc.

Модела

  • HVM domU
  • Виртуална машина
  • VirtualBox
  • KVM
  • Виртуална платформа VMware

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class OSUtil {
    
    public static final List<String> readCmdOutput(String command) {
        List<String> result = new ArrayList<>();
    
        try {
            Process p=Runtime.getRuntime().exec("cmd /c " + command);
            p.waitFor();
            BufferedReader reader=new BufferedReader(
                    new InputStreamReader(p.getInputStream())
                    );
            String line;
            while((line = reader.readLine()) != null) {
                if(line != null && !line.trim().isEmpty()) {
                    result.add(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return result;
    }
    
    public static final String readCmdOutput(String command, int lineNumber) {
        List<String> result = readCmdOutput(command);
        if(result.size() < lineNumber) {
            return null;
        }
    
        return result.get(lineNumber - 1);
    }
    
    public static final String getBiosSerial() {
        return readCmdOutput("WMIC BIOS GET SERIALNUMBER", 2);
    }
    
    public static final String getHardwareModel() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MODEL", 2);
    }
    
    public static final String getHardwareManufacturer() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MANUFACTURER", 2);
    }
    
    public static void main(String[] args) {
        System.out.println("BIOS Serial: " + getBiosSerial());
        System.out.println("Hardware Model: " + getHardwareModel());
        System.out.println("Hardware Manufacturer: " + getHardwareManufacturer());
    }
    }
    

Можете да използвате изхода, за да решите дали е VM или физическа машина:

Физически изход на машината:

Сериен номер на BIOS: 2HC3J12
Модел на хардуера: Inspiron 7570
Производител на хардуер: Dell Inc.

Изход на виртуална машина:

Сериен номер на BIOS: 0
Модел на хардуера: Innotec GmBH
Производител на хардуер: Virtual Box

person Pritesh Mhatre    schedule 20.06.2018
comment
бих приложил това решение и за linux, но ще ми трябва списък с модели за най-известните виртуални системи, къде мислите, че мога да го намеря - person Lukas Owen; 12.12.2019
comment
Списъкът в отговора обхваща най-широко използвания софтуер за виртуализация. - person Pritesh Mhatre; 14.12.2019
comment
@LukasOwen Вижте списък с виртуални машини: en.wikipedia.org/wiki/ - person Sorry IwontTell; 14.11.2020

Ако VM върши работата добре, трябва да е невидимо за клиента, че се виртуализира. Човек обаче може да погледне и други улики.

Предполагам, че търсенето на известни драйвери или софтуер, специфичен за VM средата, би било най-добрият възможен начин.

Например, на клиент на VMWare, работещ под Windows, vmxnet.sys ще бъде мрежовият драйвер, показан като VMware ускорен AMD PCNet адаптер.

person Mythokia    schedule 02.09.2008

Един добър пример е, че очевидно правите WMI заявка за производителя на дънната платка и ако тя върне „Microsoft“, вие сте във VM. Мислех, че вярвам, че това е само за VMWare. Вероятно има различни начини да разберете за всеки хост софтуер на VM.

Тази статия тук http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx има някои добри предложения и връзки към няколко начина за откриване дали сте във VM (поне VMWare и VirtualPC).

person Adam Haile    schedule 02.09.2008

Може да успеете да определите дали сте във виртуална машина, като погледнете MAC адреса на вашата мрежова връзка. Xen например обикновено препоръчва използването на специфичен диапазон от адреси 00:16:3e:xx:xx:xx.

Това не е гарантирано, тъй като администраторът на системата трябва да посочи какъв MAC адрес иска.

person tonylo    schedule 02.09.2008
comment
Освен това всяка VM компания може да се регистрира за нов набор от номера на MAC адреси по всяко време. В момента VMWare има 4 различни MAC диапазона (според търсене в ieee.org за присвоени номера.). - person Jesse Chisholm; 26.05.2013

В Linux системите можете да опитате да търсите общи файлове в /proc.

Например съществуването на /proc/vz/ ви казва, че е OpenVZ.

Ето пълно ръководство за откриване на средата на VM под Linux, без да се налага " пийте хапчета" :)

person m3nda    schedule 26.11.2013

TrapKIT предоставя ScoopyNG, инструмент за идентификация на VMware – той се опитва да заобикалят техниките за избягване, но не е непременно насочен към софтуер за виртуализация, различен от VMware. Налични са както сорс, така и двоични файлове.

person Tim    schedule 30.07.2010
comment
Това беше... доста оскъден отговор, както е написано първоначално. - person Charles Duffy; 05.11.2014