Подписване на драйвери в Windows

Вместо увод ще отговоря на няколко въпроса:

Какво е драйвер?

Драйверът е специализиран софтуер, даващ възможност на компютърната система да осъществява комуникация с хардуера за който е този драйвер. Без драйвери хардуерът, който сте свързали към компютъра (например видеокарта или уеб камера), няма да работи правилно.

Какво е подписан драйвер?

Подписаният драйвер е софтуер за устройство, включващ цифров подпис.

Какво е цифров подпис и как се използва за подписвне на драйвери?

Цифровият подпис е електронен знак за сигурност, който определя издателя на софтуера, както и това, дали някой е променял драйвера след подписването му. Ако даден драйвер е подписан от издател, който е проверен от сертифициращ орган, можете да сте сигурни, че софтуерният драйвер е от този издател и не е бил променян.

Защо Microsoft въведе подписването на драйвери?

При инсталация на драйвери в съвременните Windows операционни системи се използват цифрово подписани драйвери за да може операционната система да се увери в целостта на пакетите на драйвера и за да определи дали може да се довери на производителя  създал драйвера  (анг. термин е The signer is trusted).

Кои файлове се подписват?

При подписването на драйвери със сертификат може да се изберат два варианта за подписване на файлове.
Първият е да се подпише каталог файла съдържащ информация за всички останали файлове от пакета с драйвери, а вторият е да се имплементира подписа дирекнто в даден драйвер файл който зарежда ОС.

Каква е разликата в подписването на каталог файла и вграждането на подпис директно в драйвера?

Директното подписване (embedded signature) се използва само в 64 битови ОС Microsoft Vista и по-нови и се използва за драйверите които се стартират заедно със “бутването” на ОС. Тези драйвери трябва да имат вграден подпис – Software Publisher Certificate (SPC). Този тип подписване не е задължителен за драйвери които не се зареждат при стартиране (boot-start). Драйверите които се стартират заедно с операционната система имат повече права за достъп и  ги наричат още kernel-mode драйвери.
Използвайки този тип подписване на драйвера времето на стартиране на ОС намалява защото няма необходимост да се търси и намира каталог файла на драйвера при стартирането на ОС. Вграждането на подпис в драйвера е задължително за всички драйвери които се стартират при стартирането на ОС за х64 битовите версии на Windows Vista и по-нови.

Подписването на каталог файлове в съвременните версии на 64 битовият Windows най-често се използва при драйвери за устройства от типа Plug and Play (PnP). Този тип подписване съществува и в по-стари операционни системи (въведено с Windows 2000). При използване на този тип подписване при инсталацията на драйверите ОС копира и съхранява каталог файла на този драйвери в папка %SystemRoot%\CatRoot и inf файла в %SystemRoot%\Inf. Това се изпълнява със следните “директиви” CatalogFile directive, INF CopyFiles directives. Подписа вграден в каталог файла съдържа отпечатъците на всички файлове от този набор от драйвери. По време на инсталацията се проверяват тези отпечатъци и обявяват пакета за невалиден ако се открие промяна на някой от файловете настъпила след подписването (тоест отпечатъците не съвпадат).

Процеси при подписване на драйвери

  • Производителя на драйвера получава от сертифициращ орган ( Certificate Authority – CA) цифров сертификат за подписване X.509. Този сертификат се издава след като CA е проверил производителя. Сертификата за подписване съдържа набор от данни които индетифицират производителя.
  • Подписването със сертификат се използва за да се подпише каталог файл (.cat) или директно да се подпише драйвера. Сертификатът за подписване съдържа двойка ключове: частен и публичен ключ. Частният ключ се използва за подписване на каталог файла (.cat) на пакета с драйвера или директно да се подпише и вгради в драйвера. Публичният ключ се използва за проверка на подписа направен на каталог файла или на този който е вграден в драйвера.
  • За да се подпише каталог файл или да се вгради подпис във файл процесът за подписване първо генерира криптографски хеш или отпечатък на файла или файловете. При подписване на каталог файл този отпечатък се прави на всички файлове от каталога, а когато се подписва само един драйвер файл се използва само неговият отпечатък. Следващата стъпка е да се криптира този отпечатък със частният ключ. Накрая се добавя криптираният отпечатък във файла който се подписва. Този процес също добавя информацията на издателя на софтуера и на сертифициращия орган издал сертификата за подписване. Цифровият подпис се добавя във секция от файла която не се използва при генерирането на отпечатък.

Проверка на подписаните драйвери

Процесът по проверка на цифровият подпис на файла от Windows операционна система се извършва като първо се прочете информацията за издателя на драйвера и за сертифициращият орган. След това се използва публичният ключ за да се декриптира отпечатъка.
Windows преминава към инсталиране на драйвера ако:

  • декриптираният отпечатък съвпада с отпечатъка на файла
  • сертификатът на издателя се намира в раздела Доверени Издатели (Trusted Publishers certificate store.)
  • root сертификата на сертифициращият орган издал сертификата на издателя в инсталиран в “Trusted Root Certification Authorities certificate store”

Сертифициращ орган ( Certificate Authority – CA) е орган в мрежа, която решава и управлява идентификационни данни за сигурност и публичен ключове за криптиране на съобщение.

От информацията дотук можем да извадим няколко извода
  • Драйвери без валиден цифров подпис или такъв, който е променян, след като е бил подписан, не могат да се инсталират на 64-битови на Windows.
  • Подписването на драйвери е въведено за да се предпазят операционните системи от вируси вградени в драйверите – особено kernel-mode драйверите.
  • Подписа гарантира, че производителя на драйвера е достоверен източник на софтуер за Windows.
1. Find and document as much as possible for the Windows Driver Signing process