Как обновить curl в Windows
Добрый день! Уважаемые читатели и гости блога. В нашем бурно динамическом мире, особенно в последние годы стал очень остро стоять вопрос информационной безопасности, примером очень много в 2024-2025 году. В сегодняшней публикации я вам покажу, как можно устранить уязвимость CVE-2025-5399 связанную с тем, что с помощью утилиты curl.exe можно устроить DDOS атаку, если вредоносный сервер отправит вам специальным образом созданный пакет. Чтобы этого избежать вам необходимо обновить вашу версию curl.exe до версии выше 8.14.0. На текущий момент, это версия 8.15, чем мы и займемся ниже.
Где брать свежую версию curl.exe
Как я указал выше CVE-2025-5399 рекомендует нам обновить исполняемый файл curtl.exe. Сделать это очень про, для этого вам необходимо зайти на официальный сайт, где собирают бинарные файлы под Windows, на текущий момент, актуальной является версия 8.15.
https://curl.se/windows/
Далее вам необходимо распаковать ZIP-архив, в результате вы получите папку bin, содержащую свежую версию curl.exe.
Где располагается файл curl.exe
В 99% случаев файл curl.exe будет располагаться по пути C:\Windows\System32\, но бывает, что может быть установлен, например утилитой WinGet и в локальный профиль пользователя. Чтобы это проверить откройте командную строку и введите команду:
where curl
В моем примере есть две версии curl по путям:
- C:\Windows\System32\curl.exe
- C:\Users\sem\AppData\Local\Microsoft\WinGet\Links\curl.exe
Давайте проверим для каждого файла его версию, для этого есть ключ -V. В результате видно, что в системной папке старая, уязвимая версия curl.exe 8.13.
C:\Users\sem>C:\Windows\System32\curl.exe -V
curl 8.13.0 (Windows) libcurl/8.13.0 Schannel zlib/1.3.1 WinIDN
Release-Date: 2025-04-02
Protocols: dict file ftp ftps http https imap imaps ipfs ipns mqtt pop3 pop3s smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSocketsC:\Users\sem>C:\Users\sem\AppData\Local\Microsoft\WinGet\Links\curl.exe -V
curl 8.15.0 (x86_64-w64-mingw32) libcurl/8.15.0 LibreSSL/4.1.0 zlib/1.3.1.zlib-ng brotli/1.1.0 zstd/1.5.7 WinIDN libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.66.0 ngtcp2/1.14.0 nghttp3/1.11.0
Release-Date: 2025-07-16
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli CAcert HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL SSLS-EXPORT SSPI threadsafe UnixSockets zstd
Вот ее я и хочу обновить. Кстати, если вам необходимо массово проверить версию файл curl на куче серверов, то вот вам мой скрипт на PowerShell, который поможет это получить.
# Получаем список серверов из файла
$servers = Get-Content -Path "C:\Temp\servers.txt"$results = @()
foreach ($server in $servers) {
try {
# Проверяем доступность сервера
if (Test-Connection -ComputerName $server -Count 1 -Quiet) {
# Получаем информацию о файле удаленно
$file = Invoke-Command -ComputerName $server -ScriptBlock {
Get-Item -Path "C:\WINDOWS\System32\curl.exe" | Select-Object FullName, VersionInfo
} -ErrorAction Stop$results += [PSCustomObject]@{
"Имя сервера" = $server
"Путь до файла" = $file.FullName
"Версия файла" = $file.VersionInfo.FileVersion
}
} else {
$results += [PSCustomObject]@{
"Имя сервера" = $server
"Путь до файла" = "Недоступен"
"Версия файла" = "Недоступен"
}
}
} catch {
$results += [PSCustomObject]@{
"Имя сервера" = $server
"Путь до файла" = "Ошибка: $($_.Exception.Message)"
"Версия файла" = "Ошибка"
}
}
}# Выводим результат
$results | Format-Table -AutoSize# Дополнительно: можно экспортировать в CSV
# $results | Export-Csv -Path "результаты_версий_curl.csv" -NoTypeInformation -Encoding UTF8
В результате на 50 хостах RDS фермы, я вижу, что CVE-2025-5399 не закрыта.
Как заменить curl.exe на новый файл локально
Показывать я буду на своей системе с Windows 11, но оно применимо и к любой другой современной ОС. Вроде бы все тривиально вы берете новый файл и копируете его взамен старого, но тут вы получите ошибку:
Вам необходимы разрешения на выполнение этой операции
Тут все дело в том, что у группы Администраторы нет прав на изменение данного файла. По умолчанию полноправным владельцем тут является TrustedInstaller.
Тут я могу выкрутиться двумя методами, с помощью утилиты Unlocker, и второй метод, как по мне лучший, это PowerShell.
Очень важно, чтобы после замены файл curl.exe по пути C:\WINDOWS\System32\ его владельцем оставался TrustedInstaller, чтобы у системы не было проблем с дальнейшим его обновлением, если оно прилетит в кумулятивном пакете.
Запустите PowerShell ISE в режиме администратора и воспользуйтесь моим кодом:
# Установка группы "Администраторы" как владельца файла curl.exe
$filePath = "C:\WINDOWS\System32\curl.exe"
$adminGroup = [System.Security.Principal.NTAccount]"Администраторы"
$trustedInstaller = [System.Security.Principal.NTAccount]"NT SERVICE\TrustedInstaller"# Получаем текущий DACL файла
$acl = Get-Acl -Path $filePath# Устанавливаем временного владельца (Администраторы)
$acl.SetOwner($adminGroup)
Set-Acl -Path $filePath -AclObject $acl# Даем группе "Администраторы" полные права (временно)
$fullControlRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$adminGroup,
"FullControl",
"None",
"None",
"Allow"
)
$acl.AddAccessRule($fullControlRule)
Set-Acl -Path $filePath -AclObject $acl# Копирование файла с заменой
$sourceFile = "C:\Users\sem\Downloads\curl-8.15.0_4-win64-mingw\curl-8.15.0_4-win64-mingw\bin\curl.exe"
$destinationFile = "C:\WINDOWS\System32\curl.exe"Copy-Item -Path $sourceFile -Destination $destinationFile -Force
# Восстанавливаем исходные права и владельца
$acl = Get-Acl -Path $filePath# Удаляем временное правило FullControl
$acl.RemoveAccessRule($fullControlRule) | Out-Null# Добавляем права только на чтение и выполнение
$readExecuteRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$adminGroup,
"ReadAndExecute",
"Allow"
)
$acl.AddAccessRule($readExecuteRule)# Восстанавливаем владельца TrustedInstaller
$acl.SetOwner($trustedInstaller)# Применяем изменения
Set-Acl -Path $filePath -AclObject $aclWrite-Host "Файл успешно заменен. Владелец и права восстановлены."
Проверим через командную строку, что версия curl стала новой.
Использование утилиты Unlocker
Есть такая старая утилита Unlocker, ее задача это управление заблокированными или занятыми файлами в системе. По сути она делает то же самое при удалении, перемещении или переименовывании файла, становясь ее владельцем, но она не делает на новом файле нужных разрешений, что для файлов в директории C:\Windows может быть критичным.
Скачать Unlocker 1.9.2 Portable можно у меня
Запускаем исполняемый файл, далее находим в окне обзора файл curl.exe. В действии выбираем переместить, чтобы в случае чего у вас остался оригинальный файл, далее остается выбрать место перемещения. После чего нажать "Ok"
Массовое обновление curl.exe на списке серверов
Я человек ленивый в рутинных задачах и стараюсь свое время расходовать более рационально, мне проще написать скрипт PowerShell за 2-3 часа, но зато потом экономить делать задачу на автомате. Ниже вы можете взять для своих нужд мой код и переделать под себя.
Так же напомню, как запускать скрипт PowerShell на сервере и как его выполнять с помощью SCCM, если он у вас есть
Так как у меня в рабочей инфраструктуре есть сервера с русской локализацией, так и с английской, можно было бы, конечно, присваивать временные права на SID Bultin администраторов, но мне проще было это сделать, для учетной записи от которой я запускаю.
У вашей учетной записи должны быть административные права на удаленные серверы, где вы планируете замену.
# Берем список серверов из файла
$servers = Get-Content -Path "C:\Temp\servers.txt" -ErrorAction Stop# Учетная запись, от которой запускается скрипт
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Nameforeach ($server in $servers) {
try {
Write-Host "Обрабатываю сервер: $server" -ForegroundColor GreenWrite-Host "Становлюсь владельцем файла..." -ForegroundColor Yellow
Invoke-Command -ComputerName $server -ScriptBlock {
param($filePath, $user)# Получаем текущего владельца
$acl = Get-Acl -Path $filePath
$originalOwner = $acl.Owner# Устанавливаем себя как владельца
takeown.exe /f $filePath
icacls.exe $filePath /setowner "$user" /Treturn $originalOwner
} -ArgumentList "C:\WINDOWS\System32\curl.exe", $currentUser -ErrorAction Stop
# Даю себе полные права
Write-Host "Устанавливаю полные права..." -ForegroundColor Yellow
Invoke-Command -ComputerName $server -ScriptBlock {
param($filePath, $user)icacls.exe $filePath /grant "$user`:F" /T
} -ArgumentList "C:\WINDOWS\System32\curl.exe", $currentUser -ErrorAction Stop
# Скопировать файл с заменой
Write-Host "Копирую файл..." -ForegroundColor Yellow
Copy-Item -Path "\\сетевой путь\share\curl\curl.exe" -Destination "\\$server\C$\WINDOWS\System32\curl.exe" -Force -ErrorAction Stop# Везвращаю права владельца TrustedInstaller
Write-Host "Возвращаю владельца TrustedInstaller..." -ForegroundColor Yellow
Invoke-Command -ComputerName $server -ScriptBlock {
param($filePath)icacls.exe $filePath /setowner "NT SERVICE\TrustedInstaller" /T
} -ArgumentList "C:\WINDOWS\System32\curl.exe" -ErrorAction Stop
# Удаляю из ACL учетную запись
Write-Host "Удаляю учетную запись из ACL..." -ForegroundColor Yellow
Invoke-Command -ComputerName $server -ScriptBlock {
param($filePath, $user)icacls.exe $filePath /remove "$user" /T
} -ArgumentList "C:\WINDOWS\System32\curl.exe", $currentUser -ErrorAction Stop
Write-Host "Сервер $server обработан успешно!" -ForegroundColor Green
} catch {
Write-Host "Ошибка при обработке сервера $server : $($_.Exception.Message)" -ForegroundColor Red
continue
}
}Write-Host "Все серверы обработаны!" -ForegroundColor Green
Повторная проверка серверов показала, что файл curl.exe успешно заменен.
Для SCCM я взял первый скрипт, лишь немного там его подредактировав на сетевую шару.
$sourceFile = "\\сетевой путь до файла\curl.exe"
$destinationFile = "C:\WINDOWS\System32\curl.exe"
Надеюсь, что вам это все было полезно. В результате вы научились получать новую версию curl.exe, успешно ее в случае необходимости устанавливать и главное закрыли уязвимость CVE-2025-5399. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org,