Stimmt etwas nicht, wenn Sie keine .NET-Assembly signieren?

94

Einer meiner Kollegen ist sehr daran interessiert, Versammlungen zu unterzeichnen. Er versucht buchstäblich alles zu unterschreiben. Selbst wenn wir Assemblys von Microsoft verwenden, die nicht signiert sind, nimmt er den Quellcode, signiert ihn und bittet andere Entwickler, stattdessen seine Kopie zu verwenden.

Ich kann die Grundidee hinter dem Signieren einer Assembly verstehen: um sicherzustellen, dass eine bestimmte Assembly nicht von einem zwielichtigen Hacker kompromittiert wird. Wenn wir also ein Softwareentwicklungsunternehmen sind, sollten wir unsere Assembly signieren, bevor wir eine .NET-Bibliothek für unsere Kunden freigeben.

Wir entwickeln hier jedoch hauptsächlich Webanwendungen für den eigenen Gebrauch, und ich kann mir nicht vorstellen, jede einzelne Baugruppe, die wir verwenden, zu signieren.

Vermisse ich hier etwas?

oscarkuo
quelle
1
Es ist erwähnenswert, hier einige Verwirrung zu stiften, "digitale Signaturen" (die einen Sicherheitszweck haben) und "stark benannte Assemblys", die eine Lösung für die Hölle darstellen und dem GAC helfen, Links zu Bibliotheken zu erstellen. Die Verwendung des einen oder anderen ist ähnlich und beide können beim Signieren einer Baugruppe erwähnt werden. Es scheint, als würden einige Plakate an eines denken und andere an ein anderes oder an beides.
Amalgamate

Antworten:

49

Das Signieren von Assemblys, die in einer vertrauenswürdigen Umgebung verwendet werden, klingt für mich nach einem Overkill.

Ein interessanter Punkt bei signierten Assemblys ist, dass sie etwas langsamer geladen werden als nicht signierte Assemblys, da sie kryptografisch überprüft werden müssen.

Um eine Baugruppe zu signieren, müssen auch alle Baugruppen signiert werden, von denen sie abhängt. Ich vermute, dass dies zum Wunsch Ihres Kollegen beiträgt, alles zu signieren - der Compiler fordert es.


BEARBEITEN Seit Sie diese Antwort geschrieben haben, können Sie sehen, dass sowohl der Profi als auch der Gegner ungefähr die gleiche Unterstützung haben. Hier gibt es eindeutig keine richtige Antwort.

Der Punkt, der diese Bearbeitung erzwungen hat, ist, dass wir heutzutage so viele Open-Source-Bibliotheken von NuGet nehmen und viele von ihnen überhaupt nicht signiert sind. Wenn Sie Ihre Assembly signieren möchten, müssen auch Abhängigkeiten signiert sein. Viele der signierten Open Source-Bibliotheken verfügen über die privaten Schlüssel zum Signieren, die öffentlich verfügbar sind, und sind in ihren Quellrepositorys verfügbar.

Wie bei allem müssen Kompromisse geschlossen werden. Nach meiner Erfahrung in der Arbeit in privaten Umgebungen sind die Vorteile des Signierens meist theoretisch (oder akademisch, wie @ user289100 erwähnt), es sei denn, Sie befürchten, dass Regierungsbehörden Ihren Code ändern. In diesem Fall müssen Sie in Bezug auf so viele Ebenen paranoid sein Ihre Infrastruktur, die das Signieren scheint, scheint ein kleiner Aufwand zu sein. Ansonsten scheint sich die Menge an Herausforderungen, die sich daraus ergeben, dass man nicht alles unterschreiben muss, einfach nicht zu lohnen. Ihre Umgebung kann jedoch andere Anforderungen haben, oder Sie können ein Masochist sein!

Siehe auch die Antwort von Teun D für Informationen zu Herausforderungen im Zusammenhang mit der Versionierung von Assemblys bei Verwendung starker Namen.

Drew Noakes
quelle
17
Einverstanden, es ist jetzt wie eine Crack-Sucht für ihn
Janie
3
Ein weiterer zu beachtender Punkt ist, dass das Signieren ein Muss ist (z. B. GAC), wenn Sie diese Assembly für verschiedene Anwendungen freigeben möchten.
Rajesh Pillai
60

Ich habe nicht signierte Versammlungen genutzt, um Probleme zu umgehen, und in akademischen Umgebungen den Leuten gezeigt, warum es wichtig ist. Ich habe eine DLL-Datei, die nicht signiert war (wieder in einer akademischen Umgebung), durch eine ersetzt, die ich mit demselben Namen und denselben Signaturen erstellt habe, und mit .NET Reflector den Originalcode kopiert und eingefügt, aber in meiner habe ich Benutzernamen und Kennwörter per E-Mail gesendet wurden übergeben, bevor "echter" Code aufgerufen wurde.

Wenn signiert, können Sie eine Signaturübereinstimmung vornehmen, diese jedoch nicht ersetzen. Im Gegensatz zu Zippy tritt zur Laufzeit ein Kompatibilitätsfehler auf.

Das Signieren von Baugruppen ist niemals übertrieben. Es dauert 30 Sekunden. Es ist, als würde man sagen, dass es übertrieben ist, die Türen zu verschließen, wenn man auf dem Land lebt. Wenn Sie mit Ihren Sachen spielen möchten, lassen Sie es offen. Es dauert nur eine Sicherheitsverletzung, um gefeuert zu werden. Das Signieren einer Baugruppe dauert nur 30 Sekunden, und es gibt keinen Geschäftsfall, dies nicht zu tun. Die Auswirkungen auf die Leistung sind vernachlässigbar.

user289100
quelle
11
Wenn ein Hacker die DLL ändern kann, kann er auch die Anwendung ändern, die die DLL aufruft.
ZippyV
12
Das ist richtig, Zippy, aber ohne den Schlüssel zum Signieren der Anwendung wird es ihnen schwer fallen, die Anwendung in einer Umgebung auszuführen, in der nur die signierte Version der ursprünglichen Anwendung ausgeführt werden darf, was in einigen Fällen der Fall wäre Umgebungen, in denen ich gearbeitet habe. Sie vermissen den Wald vor lauter Bäumen: Wenn Sie keine Baugruppe unterschreiben, besteht ein unnötiges Sicherheitsrisiko, dessen Vermeidung 30 Sekunden dauert, und es gibt keinen Business Case oder realen Fall, den ich jemals nicht gesehen habe Unterzeichnen Sie eine Versammlung.
user289100
39

Ein weiterer Punkt: Durch das Signieren Ihrer Assemblys wird die Abwärtskompatibilität gegenüber Versionen beeinträchtigt. Ihre Referenzen enthalten alle Versionsnummern und Versionen mit anderen Versionsnummern gelten als nicht kompatibel. Dies behindert das Upgrade auf neuere Versionen verteilter Assemblys.

Meiner Meinung nach sollten Sie Baugruppen mit Codezeichen nur dann verwenden, wenn Sie einen konkreten Vorteil daraus ziehen:

  • Wenn Sie in Umgebungen bereitstellen, in denen nicht vertrauenswürdige Personen Ihre Assemblys möglicherweise berühren
  • In bestimmten Plug-In-Modellen, in denen Sie das Zertifikat als Nachweis für die Aktualisierung der Vertrauensstellung verwenden möchten
  • Wenn Ihr Code von einem anderen signierten Code aus aufgerufen werden kann (ein Projekt wie beispielsweise log4net signiert seinen Code zu Recht als weit verbreitet); die Kompatibilität wurde durch den Verlust ihres geheimen Schlüssels vor einigen Jahren erheblich beeinträchtigt, ein weiteres Risiko der Codesignatur.) .
  • Wenn Sie im GAC bereitstellen möchten
Teun D.
quelle
9

Hat Ihr Kollege Ihnen Hinweise gegeben, warum er gerne Versammlungen unterzeichnet? Ein Vorteil beim Signieren, der hier noch nicht erörtert wurde, besteht darin, dass nur signierte Assemblys in den GAC gestellt werden können (dh von verwalteten Prozessen gemeinsam genutzt werden), aber die Nachteile scheinen aus meiner (zugegebenermaßen unerfahrenen) Perspektive die Vorteile zu überwiegen.

Ihre Anekdote über die Selbstsignierung von Microsoft-Code scheint mir besonders verdächtig. Wenn MS den Code nicht signiert hat, gibt es wahrscheinlich einen Grund, oder? Und wenn Sie es unterschreiben, übernehmen Sie die Verantwortung dafür, wenn Sie es nicht geschrieben haben - eine weitere Gelegenheit für die Zukunft, Sie zu beißen.

Dan Davies Brackett
quelle
2
Eigentlich bin ich mir nicht sicher warum, aber Microsoft hat Enterprise Library 3.1
oscarkuo
1
Warum sollte die Freigabe einer Assembly zwischen Prozessen erfordern, dass sich die Assembly im GAC befindet?
Dirk Vollmar
4
Es ist nicht so, dass Sie keine Laufzeitreferenzen für dieselbe DLL freigeben können, sondern dass nur Assemblys mit starken Namen (dh signierten) in den GAC gelangen können - und Assemblys werden in den GAC eingefügt, damit sie gemeinsam genutzt werden können.
Dan Davies Brackett
4

Eine andere Sache beim Unterzeichnen einer Versammlung ist, dass man keine falsche anstelle Ihrer verspritzen kann (auch - Sie selbst durch einen Unfall). Wenn Sie beispielsweise ein Programm erstellen, das auf eine Assembly Foo.dll, Version 1.0, verweist, kann jemand eine Assembly mit derselben Version erstellen und Ihre ersetzen, wenn Sie Ihre Bibliothek signieren. Dies ist nicht möglich (at Zumindest glaube ich nicht, dass es leicht möglich ist.

Marcin Deptuła
quelle
4

Signaturen sind nur erforderlich, wenn die Baugruppen im GAC platziert sind, sonst nichts. Signierte Baugruppen hindern niemanden daran, sich mit ihnen anzulegen. Ein Hacker kann weiterhin die Signatur und jeden anderen Code entfernen, der nach der Signatur sucht.

ZippyV
quelle
2
Für eine Webanwendung müsste der Hacker auch die Datei web.config ändern.
Tangurena
3
Wenn ein Hacker Signaturen aus einer Assembly entfernen kann, werden sie auch von der web.config nicht gestoppt.
ZippyV
4
Downvotern wird empfohlen, ianpicknell.blogspot.com/2010/02/… und ähnliche Artikel zu lesen, die von diesem verlinkt sind.
Constantin
1
Aktuell: ja und nein. Ich habe es versucht, und Windows überprüft standardmäßig NICHT die Signatur ("starker Name"). Wahrscheinlich benutzerfreundlich :-) Die Links, auf die verwiesen wird, zeigen, was zu App.config hinzugefügt werden muss, um die Signaturprüfung zu erzwingen. Und dann funktioniert die Signaturprüfung im Gegensatz zum Artikel wirklich und erkennt jegliche Manipulation, sei es mit Version Nr. Oder Inhalt.
Roland
3

Ich stimme zu, es scheint eine Verschwendung zu sein. Es ist wirklich notwendig, um sicherzustellen, dass die Datei so ist, wie Sie denken (und nicht manipuliert wurde). Wenn Sie jedoch den Grenzen Ihrer eigenen Netzwerksicherheit und Ihres Webservers vertrauen, erscheint das Signieren Ihrer Webassemblys als redundanter Schritt.

Aber vielleicht ist das meine Erfahrung als Kleinunternehmer. Wenn Sie über eine geschäftskritische Online-Banking-Website sprechen, melden Sie sich ab.

Steve Wortham
quelle
2

Denken Sie darüber nach, wenn Sie etwas versenden und / oder tatsächlich einen Grund dafür haben. In jedem anderen Fall ist es nur Ärger. Ich würde Ihren Arbeitskollegen fragen, was er davon hat.

Ich bin schon einmal auf signierte Assembly-Itis gestoßen, und es ist ein Schmerz im hinteren Bereich, besonders wenn man bedenkt, wie viele Leute wenig bis gar nichts über das Signieren von Assemblys wissen, wofür es ist und wie es zu tun ist. Es ist nur eine andere Sache, mit der Sie sich nicht befassen sollten, es sei denn, dies ist absolut notwendig.

Mark Simpson
quelle
1

Sie müssen Ihre Assembly signieren, wenn sie in einem ClickOnce XBAP aus dem Web bereitgestellt wird .

Darüber hinaus müssen auch alle Assemblys, auf die verwiesen wird, signiert werden.

goodguys_activate
quelle
1

Wir signieren unsere Assemblys, weil manchmal Fehler wie die folgenden auftreten (diese stammen aus Tests, können jedoch beim Ausführen der Anwendung auftreten):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Wir hatten festgestellt, dass Visual Studio manchmal etwas falsch macht und alten Code ausführt .

Wenn Sie einen Fehler wünschen, wenn Sie alten Code ausführen, signieren Sie Ihre Assemblys.

Wenn Sie ein Nuget- Paket schreiben , unterschreiben Sie bitte Ihre Baugruppen . Nicht signierte Assemblys sind für uns umständlich, wenn wir sicherstellen möchten, dass wir die neueste Version unseres Codes ausführen. Ich kann Visual Studio nicht reparieren . Ich kann nur feststellen, dass Visual Studio etwas falsch gemacht hat. Bitte unterschreiben Sie Ihre Nuget-Baugruppen .

Clay Lenhart
quelle
Update: Die Flut der Verwendung nicht signierter Assemblys gewinnt;) Wir lösen das obige Problem anders: Erstellen und Testen auf einem CI-Server ausgehend von einem leeren oder "sauberen" Verzeichnis. Vielleicht haben wir das Szenario lokal auf unseren Entwicklungsmaschinen, aber es kommt selten vor, dass es passiert oder keine großen praktischen Auswirkungen hat.
Clay Lenhart