Установка свежей версии libssl-1_1-x64.dll и закрытие уязвимости
Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik. В прошлый раз мы с вами решили проблему с запуском некоторых игр, на которых не хватало установленной библиотеки VCRUNTIME140.dll. Сегодня вновь речь пойдет про библиотеки. У меня в компании каждый месяц коллеги из отдела информационной безопасности проводят разные сканирования и тесты, по результатам которых всегда есть, что-то не что нужно обратить внимание и исправить. Очень часто это бывают замечания по уязвимостям, в этом сканировании потребовалось выполнить это по отношению к библиотеке libssl-1_1-x64.dll, о которой я и поговорю.
Что за библиотека libssl-1_1-x64.dll и за что она отвечает
Библиотека libssl-1_1-x64.dll является частью OpenSSL, который является популярной криптографической библиотекой с открытым исходным кодом. OpenSSL предоставляет реализацию протоколов шифрования SSL (Secure Sockets Layer) и TLS (Transport Layer Security), а также других криптографических функций. Библиотека libssl-1_1-x64.dll конкретно отвечает за реализацию SSL и TLS протоколов в приложениях, использующих OpenSSL. Она обеспечивает шифрование данных, аутентификацию и обеспечение безопасности соединений по сети.
Проблематика старых версий libssl-1_1-x64.dll
Как я и писал выше отдел ИБ прислал свежий отчет, в котором у меня на RDS ферме были замечания, по таким продуктам как MS Office в драйверах ODBC Drivers, XnViewMP просмоторщик и так далее. Есть целый стек замечаний по библиотеке libssl-1_1-x64.dll в открытом доступе, прочитать о них можно в CVE-2021-3712, CVE-2021-23840, CVE-2021-23840, CVE-2019-1543, CVE-2018-0732, CVE-2017-3731 и CVE-2021-3711. Я не буду останавливаться на нюансах ее использования, моя задача ее обновить. Для этого я ее скачаю и заменю по нужным путям.
Вот примеры путей, где есть устаревшая библиотека:
C:\Program Files\XnViewMP\libssl-1_1-x64.dll (1.1.1.7)
C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers \Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\libssl-1_1-x64.dll (1.1.1.7)
C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers \Salesforce\lib\OpenSSL64.DllA\libssl-1_1-x64.dll (1.1.1.7)
Давайте посмотрим какая версия у меня на текущий момент, это libssl-1_1-x64.dll 1.1.1.14
Моя задача ее обновить до версии libssl-1_1-x64.dll 1.1.1.23, а лучше заменить ее на 3-ю версию.
Так же посмотреть можно посмотреть это и с помощью PowerShell:
$filePath = "C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\libssl-1_1-x64.dll"
$fileVersionInfo = Get-Command $filePath | Select-Object *
$fileVersionInfo
Можно вывести немного компактнее:
$filePath = "C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\libssl-1_1-x64.dll"
$fileVersionInfo = Get-Command $filePath | Select-Object -ExpandProperty FileVersionInfo
Write-Host "File Name: $($fileVersionInfo.FileName)"
Write-Host "File Version: $($fileVersionInfo.FileVersion)"
Где скачать libssl-1_1-x64.dll
OpenSSL 1.1.1 был выпущен 11 сентября 2018 года, поэтому он будет считаться прекращенным 11 сентября 2023 года. После этой даты он больше не будет получать общедоступные исправления безопасности. Поэтому в первую очередь рассмотрите возможность миграции библиотеки libssl-1_1-x64.dll до версии 3.2 и выше.
Можно скачать у меня libssl-1_1-x64-dll версии 1.1.1.23 (w) версия:
Как массово обновить библиотеку libssl-1_1-x64.dll на списке серверов с помощью PowerShell
Перед тем как это сделать я выполнил такие подготовительные вещи:
- Создал файловую шару в которую будет помещена библиотека
- Протестировал работу приложения и замену libssl-1_1-x64.dll версии 1.1.1 на библиотеку libssl-3-x64.dll, которую я переименовал в libssl-1_1-x64.dll.
- Подготовил список серверов, где необходимо внести замену библиотеки.
Запустите PowerShell ISE в режиме администратора и выполните скрипт внеся свои изменения под свои пути:
# Шаг 1: Взять список имен серверов из текстового файла и положить его в переменную
$servers = Get-Content -Path "C:\Temp\RDS\servers.txt"
# Шаг 2: Скопировать файл libssl-1_1-x64-dll с форсированной заменой
$sourcePath = "\\c-10.root.pyatilistnik.org\share\Библиотеки\"
$destinationPath = "C$\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\"
$destinationPath2 = "C$\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\OpenSSL64.DllA\"
$destinationPath3 = "C$\Program Files\XnViewMP\"
foreach ($server in $servers) {
Copy-Item -Path "$sourcePath\libssl-1_1-x64.dll" -Destination "\\$server\$destinationPath" -Force
Copy-Item -Path "$sourcePath\libssl-1_1-x64.dll" -Destination "\\$server\$destinationPath2" -Force
Copy-Item -Path "$sourcePath\libssl-1_1-x64.dll" -Destination "\\$server\$destinationPath3" -Force
}
Если замена libssl-1_1-x64-dll подразумевает остановку службы, то можно брать вот такой скрипт, где сначала они удаленно отключаются, выполняется замена файла и идет запуск службы.
# Шаг 1: Взять список имен серверов из текстового файла и положить его в переменную
$servers = Get-Content -Path "C:\Temp\RDS\servers.txt"
# Шаг 2: Для каждого сервера остановить указанные службы
foreach ($server in $servers) {
Invoke-Command -ComputerName $server -ScriptBlock {
Stop-Service -Name VGAuthService, vm3dservice, VMTools -Force
}
}
# Шаг 3: Скопировать файлы libssl-3-x64.dll и libcrypto-3-x64.dll с форсированной заменой
$sourcePath = "\\c-10.root.pyatilistnik.org\share\Библиотеки\"
$destinationPath = "C$\Program Files\VMware\VMware Tools\VMware VGAuth\"
foreach ($server in $servers) {
Copy-Item -Path "$sourcePath\libssl-3-x64.dll" -Destination "\\$server\$destinationPath" -Force
Copy-Item -Path "$sourcePath\libcrypto-3-x64.dll" -Destination "\\$server\$destinationPath" -Force
}
# Шаг 4: Включить указанные службы
foreach ($server in $servers) {
Invoke-Command -ComputerName $server -ScriptBlock {
Start-Service -Name VGAuthService, vm3dservice, VMTools
}
}
Автоматическое сканирование версии libssl-1_1-x64-dll с отправкой на почту
Для того чтобы автоматизировать сканирование и выявление устаревших версий библиотеки libssl-1_1-x64-dll, я могу вам предложить вот такой скрипт, в задачи которого входит сделать запрос в Active Directory на предмет активных учетных записей серверов (С помощью Get-ADcomputer) и сканирование на них данных библиотек, это важно так как нужно устранить уязвимости CVE-2021-3712, CVE-2021-23840, CVE-2021-23840, CVE-2019-1543, CVE-2018-0732, CVE-2017-3731 и CVE-2021-3711.
function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}
$log_folder = "$PSScriptRoot\Logs\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ""))
$log = "$log_folder\$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"
if (! (Test-Path $log_folder -ErrorAction SilentlyContinue))
{
New-Item $log_folder -ItemType D -Force
}
###
"$(Date) Building servers list to process" | Tee-Object $log -Append
$servers = Get-ADComputer -Filter {OperatingSystem -like "Windows Server*"} -Properties Description, OperatingSystem, lastLogonTimestamp | ? {$_.Enabled -eq $true} #| select Name, Enabled, lastLogonTimestamp
$out_data = @()
foreach ($server in $servers | sort Name) # | ? {$_.Name -like "*имя компа отдельного для проверки*"} | select -First 20
{
$lastLogonTimestamp = [datetime]::FromFileTime($server.lastLogonTimestamp)
if ($lastLogonTimestamp -le (Get-Date).AddDays(-60)) {Continue}
if ($server.Description -eq "Failover cluster virtual network name account") {Continue}
$OpenSSL_libssl_file_info = $LibCurl_libssl_file_info = [Version]$OpenSSL_libssl_file_info_version = [Version]$LibCurl_libssl_file_info_version = `
$XnView_libssl_file_info = [Version]$XnView_libssl_file_info_version = $null
try {
$OpenSSL_libssl_file_info = Invoke-Command -ScriptBlock {Get-Item "C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\OpenSSL64.DllA\libssl-1_1-x64.dll"} -ComputerName $($server.Name) -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" # | Tee-Object $log -Append
}
try {
$LibCurl_libssl_file_info = Invoke-Command -ScriptBlock {Get-Item "C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\libssl-1_1-x64.dll"} -ComputerName $($server.Name) -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" # | Tee-Object $log -Append
}
try {
$XnView_libssl_file_info = Invoke-Command -ScriptBlock {Get-Item "C:\Program Files\XnViewMP\libssl-1_1-x64.dll"} -ComputerName $($server.Name) -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" # | Tee-Object $log -Append
}
[Version]$OpenSSL_libssl_file_info_version = ((($OpenSSL_libssl_file_info.VersionInfo -split "`n") | ? {$_ -like "FileVersion*"}) -split ":")[1].Trim() -replace '[A-Za-z]', ''
[Version]$LibCurl_libssl_file_info_version = ((($LibCurl_libssl_file_info.VersionInfo -split "`n") | ? {$_ -like "FileVersion*"}) -split ":")[1].Trim() -replace '[A-Za-z]', ''
[Version]$XnView_libssl_file_info_version = ((($XnView_libssl_file_info.VersionInfo -split "`n") | ? {$_ -like "FileVersion*"}) -split ":")[1].Trim() -replace '[A-Za-z]', ''
if ($OpenSSL_libssl_file_info_version -ge '1.1.1.23' -and $LibCurl_libssl_file_info_version -ge '1.1.1.23' -and $XnView_libssl_file_info_version -ge '1.1.1.23') {Continue}
if ($OpenSSL_libssl_file_info_version -eq $null -and $LibCurl_libssl_file_info_version -eq $null -and $XnView_libssl_file_info_version -eq $null) {Continue}
$out_data += New-Object PSObject -Property @{
"Name" = $server.Name
"Enabled" = $server.Enabled
"lastLogonTimestamp" = $lastLogonTimestamp
"OpenSSL libssl Version" = $OpenSSL_libssl_file_info_version
"LibCurl libssl Version" = $OpenSSL_libssl_file_info_version
"XnView libssl Version" = $XnView_libssl_file_info_version
}
}
###
# $out_data | select Name, Enabled, lastLogonTimestamp, "OpenSSL libssl Version", "LibCurl libssl Version", "XnView libssl Version" | Export-Csv $out_file -Encoding Unicode -NoTypeInformation
"$(Date) Found $($out_data.Length) servers for notification" | Tee-Object $log -Append
###
if ($out_data.Length -gt 0)
{
$from = "tech@mail.pyatilistnik.org"
$to = "admins@pyatilistnik.org"
$Subject = "Check libssl files"
$smtpserver = "mail.pyatilistnik.org"
$secure = $true
$port = 587 # TLS, for SSL use 465
$username = "tech"
$password = 'P@ssw0rd'
$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
$body = $null
$body += "<p>Check libssl files:"
$body += "<p>Based on files:
<br><i>C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\OpenSSL64.DllA\libssl-1_1-x64.dll</i>
<br><i>C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\libssl-1_1-x64.dll</i>
<br><i>C:\Program Files\XnViewMP\libssl-1_1-x64.dll</i>"
#
$body += $out_data | select Name, Enabled, lastLogonTimestamp, "OpenSSL libssl Version", "LibCurl libssl Version", "XnView libssl Version" | ConvertTo-Html -Head $Header
$body += "<p>Generated on $($env:COMPUTERNAME + "." + $((Get-WmiObject Win32_ComputerSystem).Domain))"
###
$message = New-Object System.Net.Mail.MailMessage
$message.From = $from
$message.To.Add($to)
$message.Subject = $Subject
$message.Body = $body
$message.IsBodyHtml = $true
$smtp = New-Object Net.Mail.SmtpClient($smtpserver, $port)
$smtp.EnableSsl = $secure
$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)
"$(Date) Trying to send e-mail notification" | Tee-Object $log -Append
try {
$smtp.Send($message)
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}
###
"$(Date) End Processing" | Tee-Object $log -Append
На этом у меня все, мы успешно закрыли уязвимости CVE-2021-3712, CVE-2021-23840, CVE-2021-23840, CVE-2019-1543, CVE-2018-0732, CVE-2017-3731 и CVE-2021-3711. С вами был Иван Сёмин. автор и создатель IT портала Pyatilistnik.org.
Остались CVE-2023-5678, CVE-2024-0727 🙂