Уязвимости Libcurl.dll в Microsoft Office, Teams, PowerBI
Добрый день! Всех вновь приветствую на страницах блога. Ранее я начинал цикл статей, посвященный уязвимостям в популярных библиотеках libssl-3-x64.dll, ssleay32.dll, libssl-1_1-x64.dll, продолжу освещение данной темы и на очереди библиотека Libcurl.dll в Microsoft Office, Teams, PowerBI. Поговорим за, что она отвечает в продуктах Microsoft, разберем алгоритм патчинга до последней версии. Рассмотрим какие уязвимости несет в себе данная библиотека.
Что за библиотека Libcurl.dll
Libcurl.dll — является частью libcurl Shared Library, кроссплатформенной клиентской библиотеки для передачи данных по URL с использованием различных протоколов, таких как HTTP, HTTPS, FTP и других. Разработчиком библиотеки является проект «The curl library». Библиотека широко распространена и может входить в состав множества приложений, включая продукты Microsoft, такие, как Power BI, Microsoft Office, Microsoft Teams, а также другое программное обеспечение, например, BullGuard Internet Security, SAP BusinessObjects и Wondershare Filmora.
Таким образом, в продуктах Microsoft библиотека libcurl.dll
отвечает за безопасные и небезопасные сетевые соединения, загрузку и передачу данных, а также взаимодействие с облачными API.
Какие уязвимости бывают с Libcurl.dll
Идентификатор CVE | Краткое описание | Уровень серьезности (CVSS) | Статус и решение |
---|---|---|---|
🔒 CVE-2025-5025 | Нарушение проверки сертификата при использовании HTTP/3 и wolfSSL. Функция прикрепления открытого ключа (pinning) не работает, что позволяет подключиться к неавторизованному серверу. | 🟠 4.8 (Средний) | Исправлено в версии 8.14.1. |
🔒 CVE-2024-9681 | Ошибка в механизме HSTS, когда срок действия поддомена мог перезаписать кеш родительского домена. Это приводило к неверному времени принудительного использования HTTPS. | 🟠 5.9 (Средний) | Исправлено в версии 8.10.1. |
🔒 CVE-2024-8096 | Неправильная проверка сертификата при использовании OCSP Stapling с GnuTLS. Некоторые ошибки статуса (кроме "аннулирован") не распознавались, и сертификат ошибочно считался действительным. | 🟠 6.5 (Средний) | Исправлено в версии 8.10.0. |
🔒 CVE-2024-7264 | Уязвимость в парсере ASN.1. При обработке некорректного поля "Generalized Time" могло произойти чтение за пределами буфера в куче, что приводило к сбою или утечке данных. | 🟠 6.5 (Средний) | Исправлено в версии 8.9.1. |
Обратите внимание, что например CVE-2024-7264 от 2024 года имеет исправленную версию 8.9.1, и барабанная дробь в октябре 2025 года, в состав сентябрьской версии Microsoft Office 2021 входит libcurl.dll (8.7.0.0), как вам такое. Хотя в большинстве случае уровень уязвимости средний, это не повод его игнорировать, когда есть возможность закрыть.
Где скачивать библиотеку Libcurl.dll
В статье про обновление curl я вам приводил адрес сайта откуда можно скачать свежую версию, напомню и тут:
https://wingetgui.com/apps/cURL-cURL
На данном сайте удобно отслеживать ссылки на официальный сайт, сразу оговорюсь, что версия для 32-х битных систем запаздывает.
https://curl.se/windows/dl-8.15.0_1/curl-8.15.0_1-win32-mingw.zip
Вот пример прямой ссылки на официальный сайт.
На выходе получите архив, в котором в папке bin будет лежать библиотека Libcurl.dll.
Microsoft избавляется от libcurl.dll в MS Office
Microsoft начинает постепенно уходить от драйверов интеграции Salesforce ODBC от InsightSoftware, поддержка которого прекратится после 30 июня 2026 года.
- libcurl.dll
- libcrypto-3.dll
- libssl-3.dll
Как пишет источник для Access данные библиотеки будут безвозвратно удалены 28 октября 2025. Если вы не используете интеграции с БД, то для вас это будет приятной новостью, так как это уменьшит количество уязвимых библиотек. Для клиентов, использующих бессрочную подписку Access 2019, 2021 или 2024, драйверы будут удалены 11 ноября. Вам не нужно удалять драйверы вручную.
https://techcommunity.microsoft.com/blog/AccessBlog/access-announces-removal-of-salesforce-odbc-driver-in-october-2025/4408815
Но если вам нужны драйверы ODBC, то есть разные дополнительные поставщики, тут завит от ваших задач и финансов.
Варианты устранения уязвимостей Libcurl.dll на примере Microsoft Office 2021
Теперь когда у вас есть свежая версия библиотеки, вы можете попробовать ее заменить, если собираетесь использовать интеграции.
Обязательно сохраните старую версию Libcurl.dll
Чаще всего данная библиотека лежит в стеке ODBC драйверов по пути:
C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\libcurl.dll (8.7.0.0)
В моем примере я просто подменяю библиотеку. Обязательно проверьте, что у вас не сломался функционал.
Так же напомню, что выкладывал скрипт проверяющий удаленно версию файла, применимо для dll.
Приведу пару скриптов, где вы можете заменить библиотеку libcurl.dll расположенную на файловой шаре на нужном вам сервере. Скрипт делает:
- Задает в переменно, где в сети лежит библиотека libcurl.dll
- Указывает куда нужно скопировать файл
- Перед заменой старый файл резервируется в libcurl.dll.backup
# Путь к файлу на сетевой шаре
$sourcePath = "\\c-10.root.pyatilistnik.org\share\curl\8.15.x32\libcurl.dll"
$destinationDir = "C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\"
$originalFile = Join-Path $destinationDir "libcurl.dll"
$backupFile = Join-Path $destinationDir "libcurl.dll.backup"
$newFile = Join-Path $destinationDir "libcurl.dll"# Проверяем существование исходного файла
if (-not (Test-Path $sourcePath)) {
Write-Error "Исходный файл не найден: $sourcePath"
exit 1
}# Проверяем существование целевой директории
if (-not (Test-Path $destinationDir)) {
Write-Error "Целевая директория не найдена: $destinationDir"
exit 1
}try {
# Переименовываем оригинальный файл в .backup (если существует)
if (Test-Path $originalFile) {
Write-Host "Создание резервной копии оригинального файла..."
Rename-Item -Path $originalFile -NewName "libcurl.dll.backup" -Force
Write-Host "Резервная копия создана: $backupFile"
} else {
Write-Host "Оригинальный файл не найден, резервная копия не создана"
}# Копируем новый файл
Write-Host "Копирование нового файла..."
Copy-Item -Path $sourcePath -Destination $destinationDir -Force
Write-Host "Файл скопирован: $newFile"# Получаем версию нового файла
$fileInfo = Get-ItemProperty $newFile
$versionInfo = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($newFile)Write-Host "`nРезультат операции:"
Write-Host "=================="
Write-Host "Новый файл: $newFile"
Write-Host "Версия файла: $($versionInfo.FileVersion)"
Write-Host "Дата изменения: $($fileInfo.LastWriteTime)"
Write-Host "Размер: $([math]::Round($fileInfo.Length/1KB, 2)) KB"if (Test-Path $backupFile) {
$backupInfo = Get-ItemProperty $backupFile
Write-Host "Резервная копия: $backupFile"
Write-Host "Размер резервной копии: $([math]::Round($backupInfo.Length/1KB, 2)) KB"
}} catch {
Write-Error "Ошибка при выполнении операции: $($_.Exception.Message)"
exit 1
}
Если нужно сделать для пачки серверов
# Берем список серверов из файла
$servers = Get-Content -Path "C:\Temp\servers.txt"# Пути для копирования
$sourcePath = "\\c-10.root.pyatilistnik.org\share\curl\8.15.x32\libcurl.dll"
$destinationFolder = "C:\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\"
$destinationFile = "libcurl.dll"foreach ($server in $servers) {
Write-Host "Обработка сервера: $server" -ForegroundColor Greentry {
# Проверяем доступность сервера
if (Test-Connection -ComputerName $server -Count 1 -Quiet) {
Write-Host "Сервер $server доступен" -ForegroundColor Yellow# Формируем пути для удаленного сервера
$remoteDestinationFolder = "\\$server\C$\Program Files\Microsoft Office\root\Office16\ODBC Drivers\Salesforce\lib\"
$remoteDestinationFile = $remoteDestinationFolder + $destinationFile
$backupFile = $remoteDestinationFile + ".backup"# Проверяем существование целевой папки
if (Test-Path $remoteDestinationFolder) {# Проверяем существование оригинального файла
if (Test-Path $remoteDestinationFile) {
# Переименовываем оригинальный файл в .backup
Rename-Item -Path $remoteDestinationFile -NewName "libcurl.dll.backup" -Force
Write-Host "Оригинальный файл переименован в libcurl.dll.backup" -ForegroundColor Yellow
} else {
Write-Host "Оригинальный файл не найден, будет создан новый" -ForegroundColor Yellow
}# Копируем новую библиотеку
if (Test-Path $sourcePath) {
Copy-Item -Path $sourcePath -Destination $remoteDestinationFolder -Force
Write-Host "Новая библиотека скопирована успешно" -ForegroundColor Green# Получаем версию нового файла
$newFile = $remoteDestinationFolder + "libcurl.dll"
if (Test-Path $newFile) {
$fileVersion = (Get-Item $newFile).VersionInfo.FileVersion
Write-Host "Версия нового файла: $fileVersion" -ForegroundColor Cyan# Выводим результат
Write-Host "Сервер $server - УСПЕХ: Файл заменен. Версия: $fileVersion" -ForegroundColor Green
} else {
Write-Host "Сервер $server - ОШИБКА: Новый файл не найден после копирования" -ForegroundColor Red
}
} else {
Write-Host "Сервер $server - ОШИБКА: Исходный файл не найден по пути $sourcePath" -ForegroundColor Red
}} else {
Write-Host "Сервер $server - ОШИБКА: Целевая папка не существует: $remoteDestinationFolder" -ForegroundColor Red
}} else {
Write-Host "Сервер $server - ОШИБКА: Сервер недоступен" -ForegroundColor Red
}} catch {
Write-Host "Сервер $server - ОШИБКА: $($_.Exception.Message)" -ForegroundColor Red
}Write-Host "----------------------------------------" -ForegroundColor Gray
}Write-Host "Обработка всех серверов завершена" -ForegroundColor Green
Ручное удаление Libcurl.dll для Microsoft Office
Так как на большинстве моих серверов не используются ODBC в Microsoft Office, то я ради интереса подожду 11 ноября и проверю, что Microsoft удалит данные библиотеки, но если будет тянуть, то я подготовил скрипты PowerShell для удаления.
Microsoft очень любит при каждом месячном обновлении затягивать в папку обновления копии различных библиотек, чтобы в случае чего их можно было восстановить. Путит обычно такие:
C:\Program Files\Microsoft Office\Updates\Download\PackageFiles\DDA65E76-121C-4BDF-B55F-F390D4117D73\root\Office16\ODBC Drivers\Salesforce\lib\LibCurl64.DllA\OpenSSL64.DllA\libssl-3-x64.dll (3.0.13.0)
C:\Program Files\Microsoft Office\Updates\Download\PackageFiles\DDA65E76-121C-4BDF-B55F-F390D4117D73\root\Office16\ODBC Drivers\Salesforce\lib\libcurl.dll (8.7.0.0)
C:\Program Files\Microsoft Office\Updates\Download\PackageFiles\DDA65E76-121C-4BDF-B55F-F390D4117D73\root\Office16\ODBC Drivers\Salesforce\lib\OpenSSL64.DllA\libssl-3-x64.dll (3.0.13.0)
Обратите внимание, что тут пусть идет с использованием GUID, который на разных серверах свой, поэтому я это дело заскриптовал, чтобы оно удаляло на пачке серверов это:
# Укажите путь к файлу со списком серверов
$serverListFile = "C:\Temp\RDS\servers-delete-dll.txt"# Чтение списка серверов из файла
$servers = Get-Content -Path $serverListFileforeach ($server in $servers) {
# Формируем путь для каждого сервера отдельно
$searchPath = "\\$server\C$\Program Files\Microsoft Office\Updates\Download\PackageFiles"# Используйте Invoke-Command для выполнения команд на удаленных серверах
Invoke-Command -ComputerName $server -ScriptBlock {
param($searchPath)# Поиск и удаление файла libssl-3-x64.dll
$filePath = Get-ChildItem -Path $searchPath -Recurse -Filter "libssl-3-x64.dll" -ErrorAction SilentlyContinueif ($filePath) {
# Удаление файла
Remove-Item -Path $filePath.FullName -Force
Write-Host "Файл $($filePath.FullName) удален на сервере $env:COMPUTERNAME."
} else {
Write-Host "Файл libssl-3-x64.dll не найден на сервере $env:COMPUTERNAME."
}# Поиск и удаление файла libcrypto-3-x64.dll
$libcryptoPath = Get-ChildItem -Path $searchPath -Recurse -Filter "libcrypto-3-x64.dll" -ErrorAction SilentlyContinueif ($libcryptoPath) {
# Удаление файла
Remove-Item -Path $libcryptoPath.FullName -Force
Write-Host "Файл $($libcryptoPath.FullName) удален на сервере $env:COMPUTERNAME."
} else {
Write-Host "Файл libcrypto-3-x64.dll не найден на сервере $env:COMPUTERNAME."
}# Поиск и удаление файла libcurl.dll
$filePath = Get-ChildItem -Path $searchPath -Recurse -Filter "libcurl.dll" -ErrorAction SilentlyContinueif ($filePath) {
# Удаление файла
Remove-Item -Path $filePath.FullName -Force
Write-Host "Файл $($filePath.FullName) удален на сервере $env:COMPUTERNAME."
} else {
Write-Host "Файл libcurl.dll не найден на сервере $env:COMPUTERNAME."
}} -ArgumentList $searchPath
}
И если нужно сделать для отдельного сервера, вариант для SCCM или локального задания в шедуллере.
# Каталог, где искать бибилиотеки
$searchPath = "C:\Program Files\Microsoft Office\Updates\Download\PackageFiles"# Библиотеки для удаления
$libraries = @(
"libcrypto-3-x64.dll",
"libcurl.dll",
"libssl-3-x64.dll"
)# Проверяем существование пути
if (-not (Test-Path $searchPath)) {
Write-Host "Путь $searchPath не существует!" -ForegroundColor Red
exit
}Write-Host "Поиск библиотек в папке: $searchPath" -ForegroundColor Yellow
Write-Host "==============================================" -ForegroundColor Yellow# Ищем файлы рекурсивно
foreach ($lib in $libraries) {
$foundFiles = Get-ChildItem -Path $searchPath -Filter $lib -Recurse -ErrorAction SilentlyContinueif ($foundFiles.Count -eq 0) {
Write-Host "Библиотека '$lib' - НЕ НАЙДЕНА" -ForegroundColor Gray
}
else {
foreach ($file in $foundFiles) {
Write-Host "Библиотека '$lib' - НАЙДЕНА: $($file.FullName)" -ForegroundColor Greentry {
# Пытаемся удалить файл
Remove-Item -Path $file.FullName -Force -ErrorAction Stop
Write-Host " ✓ УДАЛЕН УСПЕШНО" -ForegroundColor Green
}
catch {
Write-Host " ✗ ОШИБКА УДАЛЕНИЯ: $($_.Exception.Message)" -ForegroundColor Red
}
}
}
}Write-Host "==============================================" -ForegroundColor Yellow
Write-Host "Операция завершена!" -ForegroundColor Yellow
Если удалять нужно по другим путям, то просто их замените в скрипте. На этом у меня все, с вами был Иван Сёмин автор и создатель данного IT блога.