Как определить, что вы работаете под виртуальной машиной?

есть ли способ определить, изнутри виртуальной машины, что ваш код работает внутри виртуальной машины?

Я думаю, что есть более или менее простые способы определить конкретные системы VM, особенно если VM имеет установленные расширения поставщика (например, для VirtualBox или VMWare). Но есть ли общий способ определить, что вы не работаете непосредственно на CPU?

12 ответов


многие исследования по этому вопросу посвящены обнаружению так называемых атак" синих таблеток", то есть вредоносного гипервизора, который активно пытается избежать обнаружения.

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

суть обсуждений в том, что всегда есть способ обнаружить вредоносный гипервизор, и гораздо проще обнаружить тот, который не пытается скрыть.


Red Hat имеет программу, которая определяет, какой (если есть) продукт виртуализации он запускается под:virt-what.

использование стороннего поддерживаемого инструмента такова, что это лучшая долгосрочная стратегия, чем попытка свернуть собственную логику обнаружения: больше глаз (тестирование против большего количества продуктов виртуализации) и т. д.


более эмпирический подход заключается в проверке известных драйверов устройств VM. Вы можете написать запросы WMI, чтобы найти, скажем, адаптер дисплея VMware, дисковод, сетевой адаптер и т. д. Это было бы удобно, если бы вы знали, что вам нужно беспокоиться только об известных типах узлов VM в вашей среде. Вот!--1-->пример выполнения этого в Perl, который может быть перенесен на язык по вашему выбору.


Это зависит от того, что вы после:

  • Если виртуальная машина не скрывается от вас специально, вы можете использовать некоторый известный крюк. Например, поиск драйверов VmWare или наличие определенных строк в памяти или некоторых других контрольных знаков.

  • Если VM действительно хочет, чтобы вы делали для него специальные вещи, у него будет какой-то очевидный крючок, например, изменение идентификатора процессора или добавление некоторых специальных регистров, к которым вы можете получить доступ обнаружить его. Или специальное устройство в известном месте в памяти (предполагая, что вы можете получить доступ к физическому пространству памяти вашего мира). Обратите внимание, что современные конструкции машин, такие как IBM Power6 и Sun UltraSparc T1/T2, предназначены для работы гипервизора всегда и никогда непосредственно на необработанном оборудовании. Интерфейс к "оборудованию", которое использует ОС, на самом деле является интерфейсом программного уровня гипервизора, без возможности обойти его. В этом случае обнаружение тривиально, так как это постоянное "да". Это вероятное будущее направление для всех компьютерных систем, которые могут позволить себе накладные расходы, посмотрите на поддержку в последних проектах, таких как Чип Freescale QorIQ P4080, например (www.freescale.com/qoriq).

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


Я однажды наткнулся на фрагмент кода сборки, который сказал вам, если вы были в виртуальной машине....Я погуглил но не смог найти оригинал статьи.

Я нашел это, хотя:определите, работает ли ваша программа внутри виртуальной машины.

надеюсь, что это помогает.


в большинстве случаев, вы не должны пытаться. Вы не должны беспокоиться, если кто-то запускает ваш код в виртуальной машине, за исключением нескольких конкретных случаев.

Если вам нужно, в Linux наиболее распространенным способом является просмотр /sys/devices/virtual/dmi/id/product_name, в котором будет указано имя ноутбука / материнской платы в большинстве реальных систем и гипервизора в большинстве виртуальных систем. dmidecode | grep Product - еще один распространенный метод, но я думаю, что для этого Требуется root-доступ.


один хороший пример-это, по-видимому, выполнение запроса WMI для производителя материнской платы, и если он возвращает "Microsoft", вы находитесь в виртуальной машине. Я думал, что это только для VMWare. Вероятно, есть разные способы сказать для каждого программного обеспечения хоста VM.

эта статья здесь http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx есть несколько хороших предложений и ссылок на несколько способов определить, находитесь ли вы в виртуальной машине (VMWare и VirtualPC, по крайней мере).


вы можете определить, находитесь ли вы в виртуальной машине, посмотрев на MAC-адрес вашего сетевого подключения. Xen, например, обычно рекомендует использовать определенный диапазон адресов 00:16:3e:xx:xx: xx.

Это не гарантируется, поскольку администратор системы может указать, какой MAC-адрес им нравится.


в системах Linux вы можете попытаться найти общие файлы в /proc.

пример, existente /proc/ vz / tell you является OpenVZ.

вот полное руководство по обнаружению окружающей среды VM под Linux без надо "пить таблетки":)


TrapKIT предоставляет ScoopyNG, инструмент для идентификации VMware -- он пытается обойти методы уклонения, но не обязательно нацелен на любое программное обеспечение виртуализации, кроме VMware. Доступны как исходные, так и двоичные файлы.


здесь (java + windows) решение для определения того, является ли базовая машина физической или виртуальной.

Примеры Виртуальных Машин:

производитель

  • Ксен
  • Корпорация Microsoft
  • innotek GmbH
  • Красная Шапочка
  • VMware, Inc.

модель

  • аппаратной виртуализации domU
  • Виртуальная Машина
  • VirtualBox
  • КВМ
  • Виртуальная Платформа 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());
    }
    }
    

вы можете использовать выходные данные, чтобы решить, является ли это виртуальной машиной или физической машиной:

физический выход машины:

серия BIOS: 2HC3J12
Аппаратная Модель: Inspiron 7570
Производитель Оборудования: Dell Inc.

виртуальная машина вывод:

серия BIOS: 0
Аппаратная Модель: Innotec GmBH
Производитель Оборудования: Virtual Box


Если это VM делает работу хорошо, она должна быть невидимой для клиента, что она виртуализируется. Однако можно взглянуть и на другие улики.

Я бы предположил, что поиск известных драйверов или программного обеспечения, специфичного для среды VM, был бы лучшим способом.

например, на клиенте VMWare под управлением Windows, vmxnet.sys будет сетевым драйвером, отображаемым как VMware accelerated AMD PCNet Adapter.