Сбой в расширении Firefox с использованием NSS

#firefox #dll #firefox-addon #pkcs#7 #nss

#firefox #dll #firefox-дополнение #pkcs #7 #nss

Вопрос:

Я новичок в разработке расширений Firefox.

Мы получили расширение firefox, которое подписывает PDF (инкапсулированная подпись), работающее для всех версий Firefox до 22 (22 не включены) С использованием NSS 3.12. После этой версии Firefox в используемом им NSS происходит модификация. Это расширение является расширением JS, вызывающим функции C с использованием ctypes.

Моя цель — заставить это расширение работать на версии firefox, превосходящей 22.

Я получил в своих библиотеках расширений nspr4.dll , nss3.dll , nssutil3.dll , plc4.dll , plds4.dll сгенерировано с помощью mozilla-сборки из выпуска NSS.

полученный нами код очень похож на тот, что вы можете найти здесь :https://github.com/metajack/nss/blob/master/cmd/p7sign/p7sign.c

код работает хорошо (он успешно получает информацию о сертификатах, создает SEC_PKCS7ContentInfo с помощью SEC_PKCS7CreateSignedData (…), устанавливает его содержимое с помощью SEC_PKCS7SetContent (..), включает цепочки сертификатов) до вызова SEC_PKCS7Encode. при использовании этого метода происходит сбой fireFox.

Я использовал WinDbg для получения трассировки стека, и вот что я получил:

 *******************************************************************************
*                                                                             *
*                           Exception Analysis                                *
*                                                                             *
*******************************************************************************


FAULTING_IP: 
plds4!PL_HashTableLookupConst c
721b1c7c 8b4f0c          mov     ecx,dword ptr [edi 0Ch]

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
.exr 0xffffffffffffffff
ExceptionAddress: 00000000721b1c7c (plds4!PL_HashTableLookupConst 0x000000000000000c)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: 000000000000000c
Attempt to read from address 000000000000000c

CONTEXT:  0000000000000000 -- (.cxr 0x0;r)
.cxr 0x0;r
eax=063e7b90 ebx=00000000 ecx=dd4c128b edx=063e7c98 esi=063e7b90 edi=00000000
eip=721b1c7c esp=0067c1e8 ebp=063e7898 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210206
plds4!PL_HashTableLookupConst 0xc:
721b1c7c 8b4f0c          mov     ecx,dword ptr [edi 0Ch] ds:002b:0000000c=????????
.cxr

FAULTING_THREAD:  00000000000016cc

PROCESS_NAME:  firefox.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - L

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - L

EXCEPTION_PARAMETER1:  0000000000000000

EXCEPTION_PARAMETER2:  000000000000000c

READ_ADDRESS:  000000000000000c 

FOLLOWUP_IP: 
plds4!PL_HashTableLookupConst c
721b1c7c 8b4f0c          mov     ecx,dword ptr [edi 0Ch]

APPLICATION_VERIFIER_FLAGS:  0

APP:  firefox.exe

ANALYSIS_VERSION: 6.3.9600.17029 (debuggers(dbg).140219-1702) amd64fre

BUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_READ_ZEROED_STACK

PRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_READ

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_READ

LAST_CONTROL_TRANSFER:  from 00000000716b9231 to 00000000721b1c7c

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
0067c1f4 716b9231 00000000 063e7b90 063e7ca0 plds4!PL_HashTableLookupConst 0xc
00000000 00000000 00000000 00000000 00000000 nssutil3!SECOID_FindOIDTag_Util 0x11


STACK_COMMAND:  .cxr 0x0 ; kb

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  plds4!PL_HashTableLookupConst c

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: plds4

IMAGE_NAME:  plds4.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  53a04c1e

FAILURE_BUCKET_ID:  NULL_CLASS_PTR_READ_c0000005_plds4.dll!PL_HashTableLookupConst

BUCKET_ID:  
APPLICATION_FAULT_NULL_CLASS_PTR_READ_ZEROED_STACK_plds4!PL_HashTableLookupConst c

ANALYSIS_SOURCE:  UM

FAILURE_ID_HASH_STRING:                          um:null_class_ptr_read_c0000005_plds4.dll!pl_hashtablelookupconst

FAILURE_ID_HASH:  {2f7bb160-6820-dd99-35e3-03bb56e8aca4}

Followup: MachineOwner
---------
  

Это означает, что при вызове SEC_PKCS7Encode он вызывает метод в PLDS4.DLL это приводит к сбою Firefox.

Я попытался вызвать SEC_PKCS7Encode, используя пустой SEC_PKCS7ContentInfo (с помощью SEC_PKCS7CreateData()), и это не привело к сбою. Сбой происходит только при заполнении SEC_PKCS7ContentInfo.

После некоторых проверок я нахожу эту проблему: https://bugzilla.mozilla.org/show_bug.cgi?id=702307 Я не знаю, является ли эта проблема причиной сбоя моего Firefox.

Я пытался использовать другую версию NSS (3.12, 3.15, 3.16.2), результаты точно такие же.

Есть ли какой-нибудь способ избежать этой проблемы? есть ли способ закодировать мой SEC_PKCS7ContentInfo без использования SEC_PKCS7Encode?

заранее спасибо.

РЕДАКТИРОВАТЬ 07.11.2014

Как упоминал nmaier в is response, проблема, по-видимому, заключается в использовании двух разных NSS (даже если это одна и та же версия nss, потому что, например, в mozilla разные зависимости).

Подпись (и другие процессы) выполняются в проекте C (Dll, используемая моим расширением, сгенерирована из этого проекта с помощью Visual studio 2013). Но для компиляции и сборки DLL проект должен иметь библиотеки NSS и includes (это вполне нормально, я использую методы NSS в своем проекте). Главный вопрос в том, как я могу ссылаться на библиотеки NSS MOZILLA FIREFOX и включать. Я скомпилировал NSS той же версии NSS Firefox, но зависимости разные. Я также пытался получить исходные файлы FireFox и скомпилировать его NSS с помощью mozilla build, но я получил ошибки. Если я смогу получить библиотеки NSS Firefox, я мог бы просто загрузить NSS dll Firefox в свое расширение.

Как я могу использовать библиотеки NSS Mozilla Firefox в моем проекте на C для создания моей пользовательской библиотеки DLL с использованием правильных библиотек?

Комментарии:

1. Вы, конечно, имеете в виду C функции, а не C functions (ctypes не поддерживает последнее)?

Ответ №1:

Я бы ожидал, что это будет неправильно: Firefox уже загружает nss и зависимые библиотеки. Попытка загрузить «ту же» DLL снова, но в другой версии приведет к тому, что загрузчик DLL разрешит зависимый импорт, используя экспорт из первоначально загруженной DLL, поставляемой с Firefox, а не ваши копии более старых версий той же библиотеки DLL. И эта смесь нового и старого затем ломается и вылетает.

Вы должны:

  • В первую очередь не создавать и отправлять библиотеки DLL…
  • но используйте библиотеки DLL, с которыми Firefox уже поставляется. (например, см. WeaveCrypto.js )
  • Обновите свои ctypes вызовы, если используемый им nss API изменился за это время.
  • Убедитесь, что ваши ctypes объявления верны и по-прежнему актуальны.

Комментарии:

1. Спасибо за ваш ответ. На самом деле у меня уже есть проект на C , который использует NSS и выполняет весь процесс, который я хочу. Моя среда разработки — Visual Studio 2010. Проблема в том, что я не знаю, как ссылаться на NSS Firefox в моем проекте, который генерирует DLL. Он принимает только библиотеки NSS, которые включены в мой проект, поэтому я могу ссылаться только на самодельные встроенные NSS (с помощью mozilla build) (у меня нет библиотек и включений встроенной NSS DLL firefox).

2. Я не уверен, что я это понял… У вас есть пользовательская DLL, которая связывает библиотеки nss. И ctypes будут взаимодействовать с этой пользовательской DLL, но не с библиотеками nss напрямую?

3. Точно, пользовательская DLL выполняет всю подпись и спецификацию процесса, вызывающего NSS, но для сборки этой DLL я должен ссылаться в visual Studio (мой инструмент сборки) на библиотеки NSS.

Ответ №2:

Я сделал это.

Чтобы указать NSS firefox в моем проекте, мне пришлось собрать весь Firefox с помощью mozilla-build tool, а затем восстановить библиотеки и включить for внутри каталога OBJ.

это сгенерирует мой проект как DLL, который ссылается на исправную версию DLL.

(я думаю, это не лучшее решение, поскольку между Firefox 21 и 22 происходит изменение NSS NSS, поэтому мое решение будет работать только для firefox между 22 и следующей версией Firefox, которые включают изменения NSS.)