Как обновить curl в Windows

curl updateДобрый день! Уважаемые читатели и гости блога. В нашем бурно динамическом мире, особенно в последние годы стал очень остро стоять вопрос информационной безопасности, примером очень много в 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/

Скачивание последней версии curl

Далее вам необходимо распаковать ZIP-архив, в результате вы получите папку bin, содержащую свежую версию curl.exe.

Свежая версия curl.exe

Где располагается файл curl.exe

В 99% случаев файл curl.exe будет располагаться по пути C:\Windows\System32\, но бывает, что может быть установлен, например утилитой WinGet и в локальный профиль пользователя. Чтобы это проверить откройте командную строку и введите команду:

where curl

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 UnixSockets

C:\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 на списке серверов

Как заменить curl.exe на новый файл локально

Показывать я буду на своей системе с Windows 11, но оно применимо и к любой другой современной ОС. Вроде бы все тривиально вы берете новый файл и копируете его взамен старого, но тут вы получите ошибку:

Вам необходимы разрешения на выполнение этой операции

Вам необходимы разрешения на выполнение этой операции

Тут все дело в том, что у группы Администраторы нет прав на изменение данного файла. По умолчанию полноправным владельцем тут является TrustedInstaller.

ACL на файл curl

Тут я могу выкрутиться двумя методами, с помощью утилиты 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 $acl

Write-Host "Файл успешно заменен. Владелец и права восстановлены."

Скрипт по обновлению curl.exe

Проверим через командную строку, что версия curl стала новой.

Просмотр обновленной версии curl.exe

Использование утилиты Unlocker

Есть такая старая утилита Unlocker, ее задача это управление заблокированными или занятыми файлами в системе. По сути она делает то же самое при удалении, перемещении или переименовывании файла, становясь ее владельцем, но она не делает на новом файле нужных разрешений, что для файлов в директории C:\Windows может быть критичным.

Скачать Unlocker 1.9.2 Portable можно у меня

Запускаем исполняемый файл, далее находим в окне обзора файл curl.exe. В действии выбираем переместить, чтобы в случае чего у вас остался оригинальный файл, далее остается выбрать место перемещения. После чего нажать "Ok"

использование Unlocker для обновления curl

Массовое обновление 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().Name

foreach ($server in $servers) {
try {
Write-Host "Обрабатываю сервер: $server" -ForegroundColor Green

Write-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" /T

return $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

Повторная проверка серверов показала, что файл curl.exe успешно заменен.

повторная проверка версии curl

Для SCCM я взял первый скрипт, лишь немного там его подредактировав на сетевую шару.

$sourceFile = "\\сетевой путь до файла\curl.exe"
$destinationFile = "C:\WINDOWS\System32\curl.exe"

Обновление curl.exe через sccm

Надеюсь, что вам это все было полезно. В результате вы научились получать новую версию curl.exe, успешно ее в случае необходимости устанавливать и главное закрыли уязвимость CVE-2025-5399. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org,

Оцените статью
Настройка серверов windows и linux
Добавить комментарий