WinVerifyTrust prüfen, ob eine bestimmte Signatur?
Ich bin Implementierung einer Prozess-elevation helper für Windows. Es ist ein Programm, das ausgeführt wird, im erhöhten Modus, und starten Sie andere Programme mit administrator-Privilegien ohne weitere UAC-Eingabeaufforderungen. Aus Gründen der Sicherheit, ich möchte sicherstellen, dass nur binaries, die sind Digital signiert mit meiner Firma Authenticode-Schlüssel ausgeführt werden können.
Den WinVerifyTrust Funktion bekommt von mir auf halbem Weg dorthin, aber es bewirkt nur, dass ein binary ist unterzeichnet von einige Schlüssel, der Teil von Microsoft ' s chain-of-trust. Gibt es eine relativ einfache Weise führen Sie die Authenticode-überprüfung UND sicherzustellen, dass es ist signiert mit unserem privaten Schlüssel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube was du suchst ist CryptQueryObject.
Sie sollten in der Lage sein zu ziehen, der beteiligt Zertifikat aus einer PE, und zusätzliche Prüfungen, die Sie wollen.
Beispielhaft, dies erhalten Sie zu einem HCRYPTMSG. Von dort aus können Sie CryptMsgGetParam zu ziehen, was Sie wollen. Ich hatte gehofft, etwas zu machen, mehr 'robuste', aber diese APIs sind ziemlich Behaart so, wie Sie erfordern eine Menge von Verzweigungen zu handhaben, alle Ihre Rückkehr zu Fällen.
So, hier ist ein p/invoke-rific c# - Beispiel (ich begann in der C, aber das war im Grunde nicht mehr lesbar ist):
Zertifikat abrufen von Informationen von signiertem code verwenden:
Dann kannst du den cert details wie dieses:
Ein Wort der Warnung: es ist schlimmer als Sie schon dachte.
Mindestens seit der Einführung von SHA-256 signieren (hat dies schon immer der Fall?), es ist möglich für Authenticode, um mehrere Unterschriften. Sie sind nicht codiert, wie mehrere Signaturen in PKCS-7 Signatur Nachricht; statt, Sie sind nicht authentifizierte Nachricht Attribute des Typs OID_NESTED_SIGNATURE, die jeweils eine komplette PKCS-7 Signatur Nachricht.
WinVerifyTrust wird Ihnen sagen, die Datei ist gültig, wenn eine der Signaturen gültig sind, und kommen von einer vertrauenswürdigen Zertifikatkette. Aber es wird Ihnen nicht sagen, welches der Unterschrift gültig war. Wenn Sie dann CryptQueryObject Lesen Sie das vollständige PKCS-7-Nachricht, und nur einen Blick auf das Zertifikat für den primären Unterschrift (wie im code-Beispiele hier und auf der MSDN-Website), sind Sie nicht unbedingt auf der Suche auf ein geprüftes Zertifikat. Die zugehörige Signatur kann nicht mit der ausführbaren Datei, und/oder das Zertifikat möglicherweise nicht über eine trusted-CA-chain.
Wenn Sie mit den Angaben der primär-Unterschrift zu bestätigen, dass das Zertifikat ist eine, die Ihre software vertraut, Sie sind anfällig für eine situation, in der WinVerifyTrust-ist Vertrauen eine sekundäre Signatur, aber dein code ist die überprüfung der primär-Signatur-Zertifikat ist das, was Sie erwartet, und Sie haben nicht bemerkt, dass die Unterschrift von der primär-Zertifikat ist Unsinn. Ein Angreifer kann mit Ihrem öffentlichen Zertifikat, ohne den Besitz des privaten Schlüssels, kombiniert mit einigen anderen code-Signatur-Zertifikat ausgestellt hat, um jemand anderes, zu umgehen Verleger überprüft werden.
Von Win8 ab, WinVerifyTrust kann Optional Validierung der spezifischen Signaturen, so dass Sie sollten in der Lage sein zu Durchlaufen, die Signaturen zu finden, die gültig ist und eine, die Ihren Anforderungen genügt.
Wenn man Win7-kompatibel, obwohl, so weit ich weiß, die besten, die Sie verwalten können, ist MsiGetFileSignatureInformation. Aus Experimenten (wie für alles andere hier, die tatsächlichen Unterlagen ist frustrierend wollig), scheint es Rückkehr des vertrauenswürdigen Zertifikats ist bei der WinVerifyTrust-trusts ein. Aber wenn es nicht eine Vertrauenswürdige Signatur, es gibt die primäre Signatur das Zertifikat trotzdem, so haben Sie immer noch zu verwenden WinVerifyTrust zu überprüfen, die erste.
Natürlich gibt es auch viele mögliche time-of-check/time-of-use Probleme hier.
hier die Lösung gefunden:
http://www.ucosoft.com/how-to-program-to-retrieve-the-authenticode-information.html
hier ist es mit Einzug: