Jscript Неожиданные исключения
После уязвимости исправления Windows Server (CVE-2019-1367), выпущенной в 23. Сентябрь
Обновлено 07.10.2019 Также затронуты пакеты «Предварительный просмотр ежемесячного накопительного пакета» и «Ежемесячный накопительный пакет», которые не устраняют конкретные проблемы рабочего процесса Jscript
- Windows Server 2019: KB4516077, KB4524148
- Windows Server 2016: KB4516061, KB4524152
- Windows Server 2012 R2: KB4516041, KB4524156
в классическом приложении ASP на нескольких рабочих процессах случаются jscript. Неожиданные ошибки на стороне сервера:
- Ошибка активных страниц сервера 'ASP 0115'
- Выявляемая ошибка (C0000005) произошло во внешнем объекте. Сценарий не может продолжать работать
- Ошибка активных страниц сервера 'ASP 0240'
- A ScriptEngine вызвала исключение 'C0000005' в 'IActiveScript :: Close() 'из' CActiveScriptEngine :: FinalRelease () '.
Patch
Существует уязвимость удаленного выполнения кода, связанная с обработкой объектов механизмом сценариевв памяти в Internet Explorer, он же «Уязвимость, приводящая к повреждению памяти скриптовым движком». Этот идентификатор CVE уникален для CVE-2019-1221. https://www.cvedetails.com/cve/CVE-2019-1367/
Существует уязвимость удаленного выполнения кода, связанная с обработчиком сценариев объектов в памяти в Internet Explorer. Уязвимость может повредить память таким образом, что злоумышленник может выполнить произвольный код в контексте текущего пользователя. Злоумышленник, успешно воспользовавшийся этой уязвимостью, может получить те же права, что и текущий пользователь. В случае веб-атаки злоумышленник может разместить специально созданный веб-сайт, предназначенный для использования уязвимости через Internet Explorer, а затем убедить пользователя просмотреть веб-сайт, например, отправив электронное письмо. Это обновление для системы безопасности устраняет уязвимость, изменяя механизм обработки сценариев объектами в памяти. https://blog.qualys.com/laws-of-vulnerabilities/2019/09/24/microsoft-releases-out-of-band-security-updates
Патч устраняет проблему в управлении памятью. Не указано, что именно меняется, каковы новые ограничения. Но кажется, что это вызывает некоторые случаи побочных эффектов.
Природа ошибки
- Ошибки не могут быть обработаны с помощью обычного подхода try-catch
- Ошибки вызывают рабочий процесспрерывания
- Исключение, по-видимому, происходит только один раз при входе в конкретный рабочий процесс, и при повторном веб-запросе для одной и той же процедуры код завершается успешно (до тех пор, пока пул приложений не будет перезапущен).
- Иногда исключения входят в рабочий процесс первый, второй или третий раз.
- Исключение возникает, только если в свойствах отладки IIS ASP - Включить отладку на стороне сервера установлено значение False
Фон
Проверено, что проблема присутствует на всех протестированных экземплярах Сервера с патчем. Также изолировал исправление, проверив состояние до и после применения исправления (Server 2012 R2, Server 2016, Windows 10 - 1809)
- Из Classic ASP Server не может решить проблему с помощью try-catch,
- Возвращается общая ошибка - сообщение об ошибке скрипта Или, если выключено (ASP - Отправить ошибки браузеру) Коды ошибок ASP со страницей, на которой они происходят
- Просмотр событий также регистрирует эти ошибки, но без дополнительныхинформация
- Global.asa не предлагает глобальную обработку ошибок, объект ASP Server Server.GetLastError () не перехватывает исключение
Исследованные исключения с
- DebugDiag
- Sysinternals Process Monitor
- IIS - отслеживание сбоя запроса
Среда
- Пул приложений: классический конвейерный режим, включение 32-разрядных приложений: True
- Приложение: ASP
- ClientL IE 11 Enterpriseрежим с включенным ActiveX
- Идентификация пула приложений олицетворяется в вызовах веб-запроса
Идентифицированные проблемы
1 В w3wp__V ...__ Исключение первого шанса 0XC0000005.dmpИнструкция по сборке
в msvcrt! memcpy + 198 ### в C: \ Windows \ System32 \ msvcrt.dll от Microsoft Corporation вызвала исключение нарушения прав доступа (0xC0000005) при попытке чтения из ячейки памяти 0x0000000a впоток 33 Источник адреса инструкции
[0x7532a2d8] msvcrt!memcpy+198
[0x6ac17deb] jscript!AString::CopyToBuffer+4b
[0x6ac10524] jscript!AString::ConvertToBSTR+1bb74
[0x6abdf6b7] jscript!PrepareInvoke+277
[0x6abf52df] jscript!InvokeDispatch+8f
[0x6abe2f03] jscript!VAR::InvokeByDispID+523
[0x6abdbde0] jscript!NameTbl::InvokeInternal+270
[0x6abe2b17] jscript!VAR::InvokeByDispID+137
[0x6abe6083] jscript!CScriptRuntime::Run+2db3
...
Далее - корпорация Microsoft вызвала исключение нарушения прав доступа (0xC0000005) при попытке чтения из ячейки памяти 0x00000000
[0x6b7c2d77] jscript!VarStack::ScavengeRoots+27
[0x6b7c2b89] jscript!GcContext::CollectCore+79
[0x6b7c2af4] jscript!GcContext::Collect+1b
[0x6b7bca21] jscript!GcContext::ExhaustiveCollect+21
[0x6b7a604a] jscript!CSession::Close+18a
[0x6b7a32d9] jscript!COleScript::CloseInternal+13b
[0x6b7a2d36] jscript!COleScript::Close+16
[0x6b8a71ce] asp!CActiveScriptEngine::FinalRelease+1be
...
Не определена точная строкакоторая вызывает проблему, последняя запись FailedRequestTrace назначает строковую переменную из атрибута объекта Application Scope xml. (CurrentStatement return attrib.text)
Аналогичный случай - исключение нарушения доступа (0xC0000005) при попытке чтения из ячейки памяти 0x00000000
[0x6b907e09] jscript!AString::CopyToBuffer+69
[0x6b900524] jscript!AString::ConvertToBSTR+1bb74
[0x6b8e49a7] jscript!VAR::ConvertASTRtoBSTR+13
[0x6b8c49e8] jscript!VAR::GetValue+58
[0x6b8e0f34] jscript!ConvertToString+58
[0x6b922fbf] jscript!JsString+4f
[0x6b8d92e6] jscript!NatFncObj::Call+e6
...
С последующим - нарушение доступаисключение (0xC0000005) при попытке чтения из памяти 0x004e0049
[0x6b8e2d77] jscript!VarStack::ScavengeRoots+27
[0x6b8e2b89] jscript!GcContext::CollectCore+79
[0x6b8e2af4] jscript!GcContext::Collect+1b
[0x6b8dca21] jscript!GcContext::ExhaustiveCollect+21
[0x6b8c604a] jscript!CSession::Close+18a
[0x6b8c32d9] jscript!COleScript::CloseInternal+13b
[0x6b8c2d36] jscript!COleScript::Close+16
[0x6bfb71ce] asp!CActiveScriptEngine::FinalRelease+1be
...
2 в w3wp __...__ Second_Chance_Exception_C0000005.dmp инструкция по сборке в asp! CResponseBuffer :: Write + 3a
in \? \ C: \ Windows \ System32 \ inetsrv \ asp.dll от Microsoft Corporation вызвала исключение нарушения прав доступа (0xC0000005) при попытке чтения из памяти 0x00000014 в потоке 32
[0x6f042e88] asp!CResponseBuffer::Write+3a
[0x6f0452ea] asp!CResponse::WriteSz+4c
[0x6f02dd3b] asp!CErrInfo::LogErrortoBrowser+ff
[0x6f02d4c9] asp!CErrInfo::LogErrortoBrowserWrapper+d7
[0x6f02d047] asp!CErrInfo::LogError+e8
[0x6f02e241] asp!HandleError+116
[0x6f02f009] asp!HandleErrorMissingFilename+df
[0x6f04941b] asp!CActiveScriptEngine::Call+bb
[0x6f030eff] asp!CallScriptFunctionOfEngine+4d
[0x6f02f99f] asp!ExecuteRequest+173
[0x6f02f828] asp!Execute+23d
[0x6f035c6f] asp!CHitObj::ViperAsyncCallback+467
[0x6f05df53] asp!CViperAsyncRequest::OnCall+73
[0x6eefd325] comsvcs!CSTAActivityWork::STAActivityWorkHelper+45
[0x77098346] combase!EnterForCallback+16e [onecore\com\combase\dcomrem\crossctx.cxx @ 2072 + 2] onecore\com\combase\dcomrem\crossctx.cxx @ 2072 + 2
[0x7709816d] combase!SwitchForCallback+206 [onecore\com\combase\dcomrem\crossctx.cxx @ 1694] onecore\com\combase\dcomrem\crossctx.cxx @ 1694
[0x7709bae4] combase!PerformCallback+bc [onecore\com\combase\dcomrem\crossctx.cxx @ 1573 + 16] onecore\com\combase\dcomrem\crossctx.cxx @ 1573 + 16
[0x7709b7f9] combase!CObjectContext::InternalContextCallback+119 [onecore\com\combase\dcomrem\context.cxx @ 4421 + 1a] onecore\com\combase\dcomrem\context.cxx @ 4421 + 1a
[0x77198e66] combase!CObjectContext::DoCallback+26 [onecore\com\combase\dcomrem\context.cxx @ 4254] onecore\com\combase\dcomrem\context.cxx @ 4254
[0x6eefd015] comsvcs!CSTAActivityWork::DoWork+175
[0x6eeff0e0] comsvcs!CSTAThread::DoWork+26
[0x6eeff599] comsvcs!CSTAThread::ProcessQueueWork+48
[0x6eeff8dd] comsvcs!CSTAThread::WorkerLoop+13d
[0x76577e71] msvcrt!_callthreadstartex+25
[0x76577f31] msvcrt!_threadstartex+61
[0x765f0419] kernel32!BaseThreadInitThunk+19
[0x77d5662d] ntdll!__RtlUserThreadStart+2f
[0x77d565fd] ntdll!_RtlUserThreadStart+1b
...
Скорее всего, происходит от записи в файл журнала
ioo_fso = Server.CreateObject ("Scripting.FileSystemObject");... loo_file = loo_fso.OpenTextFile (ls_filename, 8, true);... try {loo_file.WriteLine ("[" + str + "]")} catch (ee) {}
Proces-Monitor отображает записи журнала "SHARING VIOLATION" для w3wp.exe при доступе к файлу журнала
3 Также испытал ASP 0115 сразу после создания настраиваемого компонента сервера
var pbkdf2;
try {
pbkdf2 = Server.CreateObject("Pbkdf2");
pbkdf2.hashPassword(ls_newpassword, 100000);
} catch (e) {
addToLogg("Login:CreateObject failed for Pbkdf2, " + e.description);
}
из журналов FailedReqLogFiles, но еще не идентифицирован в DebugDiag
Вопросы
Я знаю, что ASP Jscript - это старая, поэтапная технология, но должно быть еще много корпоративных решений, так что, возможно, кто-то еще столкнется с этими проблемами. Я ожидал бы, что Jscript будет падать обычным способом, так что ситуация с ошибкой может быть обработана
- Кто-то еще сталкивался с подобной ситуацией?
- Каковы новые ограничения на код jscript?
- Существуют ли способы обработки этих сбоев на стороне сервера перед возвратом ответа клиенту?
- Может быть, существуют некоторые параметры среды ASP / jscript, параметры управления памятью, привилегии Windows, разрешениякоторые потенциально могут решить проблемы?
Решение
Как подсказал @Max (ниже), последние Microsoft KB исправляют проблемы с Jscript Workflow.
- Единственный комментарий в КБ, который отражает jscript:
Устранена проблема с приложениями и драйверами принтера, использующими механизм JavaScript для Windows (jscript.dll) для обработки заданий на печать.
Так что, по-видимому, исправление в общей обработке jscript
Сводка КБ, в которых устранена проблема
- Server 2019 1809: KB4519338
- Сервер 2019 1903: KB4517389
- Сервер 2016: KB4519998
- Сервер 2012 R2: KB4520005
- Сервер 2012: KB4520007
- Server 2008 R2: KB4519976
- Server 2008 (с пакетом обновления 2): KB4520002
Не требуется для удаления предыдущих обновлений KB. Обратите внимание, что предыдущий ежемесячный накопительный пакет (3 октября) больше не отображается в окне «Обновления окон» после установки нового.
Хотя мне не удалось изолировать основное «исключение первого шанса 0xC0000005» от рабочих процессов:
- После применения базы знаний от 8 октября проблема 0xC0000005 больше не существует в ранее сбойных рабочих процессах
- Изолированные вторые случайные исключения также не воспроизводятся, см. Случай ntdl Access Violation, случай создания объекта сервера
- Мои изолированные образцы Regex с тестовыми данными из сбойного рабочего процесса не воспроизводили Исключение, поэтому я не могу подтвердить, что использование regex напрямую вызвало проблемы
- Однако VBScript оказался не затронут,как указывалось @ Lee
- Похоже, что это неприятная проблема в корзине, хотя исправление повреждения памяти создает несколько.