Подтверждение несанкционированного вскрытия банок - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть веб-сервер, который обслуживает OSGI-пакеты как самозаверяющие файлы JAR.Они загружаются и устанавливаются с использованием OSGI API на моих устройствах.Я включил защиту в OSGI knopflerfish и указал на хранилище ключей своим открытым ключом.Я хочу убедиться, что загружаемый код не может быть подделан во время атаки MITM или иным образом.

Чтобы проверить это, я попытался слегка изменить и перекомпилировать один из моих пакетов, которые я ранее подписал и проверил, распаковалстарый, подписанный jar и недавно скомпилированный jar с использованием 7zip, и скопировал содержимое папки META-INF, перезаписав все еще неподписанный файл MANIFEST.MF и предоставив файлы .SF и .RSA.Когда я попытался загрузить и установить этот файл JAR, я действительно получил ошибку:

[stderr] org.osgi.framework.BundleException: Failed to install bundle: java.io.IOException: MANIFEST.MF must be first in archive when using signatures.
[stderr]        at org.knopflerfish.framework.Bundles.install0(Bundles.java:178)
[stderr]        at org.knopflerfish.framework.SecurePermissionOps$14.run(SecurePermissionOps.java:727)
[stderr]        at org.knopflerfish.framework.SecurePermissionOps$14.run(SecurePermissionOps.java:723)
[stderr]        at java.security.AccessController.doPrivileged(Native Method)
[stderr]        at org.knopflerfish.framework.SecurePermissionOps.callInstall0(SecurePermissionOps.java:722)
[stderr]        at org.knopflerfish.framework.Bundles.install(Bundles.java:118)
[stderr]        at org.knopflerfish.framework.BundleContextImpl.installBundle(BundleContextImpl.java:109)
[stderr]        at no.aventi.sam.Activator.handleEvent(Activator.java:190)
[stderr]        at org.knopflerfish.bundle.event.TrackedEventHandler.handleEventSubjectToFilter(TrackedEventHandler.java:71)
[stderr]        at org.knopflerfish.bundle.event.InternalAdminEvent.deliverToHandles(InternalAdminEvent.java:153)
[stderr]        at org.knopflerfish.bundle.event.InternalAdminEvent.deliver(InternalAdminEvent.java:114)
[stderr]        at org.knopflerfish.bundle.event.QueueHandler.run(QueueHandler.java:120)
[stderr] Caused by: java.io.IOException: MANIFEST.MF must be first in archive when using signatures.
[stderr]        at org.knopflerfish.framework.bundlestorage.file.Archive.downloadArchive(Archive.java:271)
[stderr]        at org.knopflerfish.framework.bundlestorage.file.BundleArchiveImpl.<init>(BundleArchiveImpl.java:133)

[stderr]        at org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl.insertBundleJar(BundleStorageImpl.java:219)
[stderr]        at org.knopflerfish.framework.Bundles.install0(Bundles.java:161)
[stderr]        ... 11 more

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

Я не уверен, какой вывод ожидать для фактической проверки схемы безопасности.Означает ли полученная ошибка, что java обнаружил неверную подпись и отклонил ее из-за этого?Или это просто означает, что 7zip не сохранил структуру без изменений, когда я вручную записал файл jar, и лучший хакер, чем я, мог легко подделать мои файлы jar?

jarsigner -verify в файлах фальшивых банок дает мне java.lang.SecurityException: SHA-256 digest error, что имеет гораздо больше смысла, могу ли я ожидать этого, если я буду фальсифицировать банки 'правильно'?

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Исключение говорит вам, что файл JAR недействителен.Поэтому он даже не пытался проверить подпись.

7zip не подходит для создания / редактирования файлов JAR.Вы должны использовать инструмент java jar.Смотри https://www.webucator.com/how-to/how-create-jar-file-java.cfm

0 голосов
/ 23 апреля 2019

Другие ответы были правильными в том, что мой файл jar был признан недействительным с помощью 7zip без учета порядка файлов, и, таким образом, безопасность не была проблемой, с которой я столкнулся, когда получил ошибку в вопросе.Они прямо не ответили, как я должен это сделать, поэтому я покажу, как я это получил, и приму мой собственный ответ.

Я обновил подписанный jar с помощью отредактированного файла .class, используя программу jar в jdkвместо использования 7zip:

jar.exe -uvf <jarfile.jar> </path/to/classfile.class>

это привело к этой ошибке из java:

[stderr] java.lang.SecurityException: SHA-256 digest error for ****.class
[stderr]         at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:223)

, которая кажется разумной ошибкой для файла класса, который отличается от сигнатуры, и соответствует этомуиз jarsigner -verify

0 голосов
/ 18 апреля 2019

Одним из требований (подписанных) JAR-файлов является то, что манифест является первой записью в ZIP-файле.Причина в том, что манифест содержит дайджесты для ресурсов в JAR в разделе «Имя» манифеста.

 Name: foo/bar/Xyz.class
 Digest-SHA-1: 2A345C6D7890F2A345C6D7890F2A345C6D7890F
 Digest-MD5: 7890F2A345C6D789

Эти дайджесты необходимы для загрузки других ресурсов и их проверки.Файл подписавшего (.SF) содержит дайджест для этого Раздела имени также в формате манифеста.Файл .DSA или .RSA затем содержит подпись для этого файла .SF.

Если бы манифест был не первым, вы не могли бы передать JAR-файл, вам всегда нужно было бы скопировать его на диск и затем открыть его.из файла, так что у вас есть произвольный доступ.сначала запустив Manifest, JarInputStream может загрузить ресурсы, когда они прибудут, и немедленно проверить их.К сожалению, инструмент Jar Signer не основан на стандартной библиотеке криптографии JDK и в некотором роде странен.Причина, по которой вы получаете другую ошибку, заключается в том, что он, вероятно, открывает JAR как файл и, следовательно, может произвольно обращаться к манифесту, поэтому ему все равно, что манифест не первый.

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

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

...