Data Protection Advisor: Ręczne usuwanie luk w zabezpieczeniach Apache Log4j za pomocą skryptu Windows PowerShell (CVE-2021-44228, CVE-2021-45046)
Summary: Ten artykuł zawiera instrukcje dotyczące ręcznego rozwiązywania problemów z agentem DPA działającym w węźle Microsoft Windows, którego dotyczą luki Apache Log4j (CVE-2021-44228 i CVE-2021-45046). ...
Instructions
To rozwiązanie obejmuje wykorzystanie skryptu Windows PowerShell, który korzysta z natywnych poleceń skryptów systemu Windows.
Instrukcje te mogą być stosowane do każdego rodzaju instalacji DPA systemu Windows, w tym aplikacji DPA, DPA Datastore i autonomicznego agenta DPA (zainstalowanego samodzielnie na serwerze lub innym typie serwera aplikacji).
Zapoznaj się z poniższym Poradnikiem bezpieczeństwa Dell, aby uzyskać więcej informacji na temat luk w zabezpieczeniach Apache Log4j:
Aby uzyskać pytania lub pomoc w związku z tymi instrukcjami, skontaktuj się z działem pomocy technicznej firmy Dell.
Czynności do ręcznego korygowania:
Uwaga:
- instrukcje te wymagają, aby na instalacji systemu Windows zainstalowano program PowerShell i aby był on dostępny (ustawienie domyślne).
- Wymagane są uprawnienia i dostęp administratora systemu Windows.
- Pobierz plik tekstowy dołączony do tego artykułu bazy wiedzy, log4j_jndiremoval.txt.
Uwaga: na końcu niniejszych instrukcji znajduje się również pełny tekst pliku log4j_jndiremoval.txt, który można skopiować i wkleić do pliku tekstowego.
- Skopiuj lub przenieś plik tekstowy do węzła systemu Windows, którego dotyczy problem.
- Zmień nazwę pliku tekstowego i zmień rozszerzenie pliku z .txt na .ps1. Uwaga: konieczne może być przejście do opcji folderu Eksploratora Windows, wyświetlenie i zaznaczenie pola wyboru, aby wyświetlić „rozszerzenia nazw plików” przed zmianą nazwy pliku.
- Otwórz okno PowerShell systemu Windows. W menu kliknij opcję Wyszukaj i wpisz PowerShell. Powinien zostać wyświetlony komunikat „Windows PowerShell”. Kliknij prawym przyciskiem myszy pozycję Windows PowerShell i wybierz opcję „Uruchom jako administrator”.

- Zatrzymaj usługę agenta DPA. W tym celu należy użyć przystawki Usługi systemu Windows lub wiersza poleceń przy użyciu Windows PowerShell.
W oknie Windows PowerShell, jeśli jest to instalacja agenta w aplikacji DPA lub DPA Datastore, polecenie brzmi:
dpa agent stop
W oknie Windows PowerShell, jeśli jest to autonomiczna instalacja agenta DPA, polecenie brzmi:
\dpa stop
Przykład:
C:\Program Files\EMC\DPA\agent\etc\dpa stop
- W oknie Windows PowerShell zmień katalogi na katalog z plikiem skryptu.

- Uruchom skrypt w oknie PowerShell przy użyciu opcji weryfikacji, która skanuje i weryfikuje pliki, których dotyczy problem. Polecenie to:

- Po naciśnięciu klawisza Enter skrypt zostanie uruchomiony, a następnie wyświetli monit o ścieżkę do instalacji DPA. Wprowadź pełną ścieżkę do instalacji DPA.

- Po naciśnięciu klawisza Enter skrypt uruchomi się i zidentyfikuje pliki, które są narażone.

- Ponownie uruchom skrypt w oknie PowerShell, pomijając opcję Weryfikacja. W tym trybie skrypt skanuje i naprawia wszystkie pliki, których dotyczy problem. Polecenie to:
Uwaga: należy ponownie wprowadzić ścieżkę instalacji DPA.

- Po naciśnięciu klawisza Enter skrypt skanuje i naprawia znalezione zagrożone pliki.

- W tym momencie działania naprawcze zostały zakończone.
- Opcjonalnie można to sprawdzić ponownie, uruchamiając skrypt jeszcze raz. Uruchom skrypt w oknie PowerShell, korzystając z opcji Weryfikacja, która skanuje i weryfikuje pliki, których dotyczy problem. Polecenie to:

- Uruchom usługę agenta DPA. Można to zrobić za pomocą przystawki Usługi systemu Windows lub wiersza poleceń przy użyciu Windows PowerShell.
W oknie Windows PowerShell, jeśli jest to instalacja agenta w aplikacji DPA lub DPA Datastore, polecenie brzmi:
dpa agent start
W oknie Windows PowerShell, jeśli jest to autonomiczna instalacja agenta DPA, polecenie brzmi:
\dpa start
Przykład:
C:\Program Files\EMC\DPA\agent\etc\dpa start
Uzupełnienie:
poniżej znajduje się pełny tekst skryptu PowerShell. Jeśli nie można uzyskać dostępu do pliku dołączonego do tej bazy wiedzy, ten tekst można skopiować i wkleić w postaci pliku tekstowego (.txt) w celu wykorzystania w powyższych krokach.
param ( [switch]$verify ) '--------------------------------------------------------------------------' '--------------------------------------------------------------------------' ' Data Protection Advisor CVE-2021-44228, CVE-2021-45046 Patcher 1.1 ' ' Developer : Pankaj Pande(p.pande@dell.com) ' ' Release : 29 Dec 2021 ' '--------------------------------------------------------------------------' 'Welcome to CVE-2021-44228, CVE-2021-45046 Patching Tool.' 'This utility will assist you in patching Data Protection Advisor for CVE-2021-44228 and CVE-2021-45046 on a Windows system.' "Special Note : The tool automates remediation steps for all internal components. Following remediation, validation checks are also run. While this tool remediates these vulnerabilities, all available information from Apache on log4j continues to be monitored. If new CVEs are discovered, Dell Technologies' Engineering teams will clarify impact and new remediation steps where necessary. If needed this tool will be updated to include the new remediation steps." '---------------------------------------------------------------------------' function List-JndiLookup { Param ( [string[]]$JarFiles, [string] $FilenameToRemove ) #initiate the .net namespace add-type -AssemblyName 'System.IO.Compression.filesystem' "The number of files to be processed is : $($JarFiles.Count)" #list the files we are processing # them later foreach ($JarFile in $JarFiles) { "$JarFile" } $processedFiles = 0; $skippedFiles = 0; foreach ($JarFile in $JarFiles) { # Open the jar for updating (.jar files are just .zip files) try { $ProcessJarFile = [io.compression.zipfile]::Open($JarFile,'Update') } catch { # Error Handling } "Checking $JarFile for $FilenameToRemove" $totalFilesInJar = ($ProcessJarFile.Entries | Where FullName -Match $FilenameToRemove).Count if($totalFilesInJar -gt 0){ $processedFiles++ } #close Zip try { $ProcessJarFile.Dispose() } catch { # Error Handling } } if ( $processedFiles -gt 0) { Write-Host "$processedFiles file(s) found vulnerable" -fore red Write-Host "Finished...Please make sure to run the patching on this sytem" -fore red } else { Write-Host "$processedFiles file(s) found vulnerable" -fore green Write-Host "Finished...No Action needed" -fore green } } function Remove-JndiLookup { Param ( [string[]]$JarFiles, [string] $FilenameToRemove ) #initiate the .net namespace add-type -AssemblyName 'System.IO.Compression.filesystem' "The number of files to be processed is : $($JarFiles.Count)" #list the files we are processing # them later foreach ($JarFile in $JarFiles) { "$JarFile" } "Starting patching/Removel Process" $processedFiles = 0; $skippedFiles = 0; foreach ($JarFile in $JarFiles) { # Open the jar for updating (.jar files are just .zip files) try { $ProcessJarFile = [io.compression.zipfile]::Open($JarFile,'Update') } catch { # Error Handling } "Checking $JarFile for $FilenameToRemove" $totalFilesInJar = ($ProcessJarFile.Entries | Where FullName -Match $FilenameToRemove).Count if($totalFilesInJar -gt 0){ "Deleting unwanted file $FilenameToRemove from $JarFile" ($ProcessJarFile.Entries | Where FullName -Match $FilenameToRemove).Delete() $processedFiles++ } else { "File $FilenameToRemove not found inside $JarFile, this may have already been deleted." $skippedFiles++ } # Clean up / close the zip try { $ProcessJarFile.Dispose() } catch { # Error Handling } } "$processedFiles file(s) processed`n$skippedFiles file(s) skipped" Write-Host "Finished..." -fore green } if ( $verify ) { Write-Host "Running in dry-run mode. Will not process any files" -fore green } else { Write-Host "Running in fix mode. Will patch files that are found affected" -fore red } $dpa_path = Read-Host "Enter the DPA location " Write-Host "Running in : '$dpa_path' " -fore green if ($verify) { List-JndiLookup -JarFiles (Get-ChildItem -Exclude 'tmp' -Recurse -Path "$dpa_path" -Filter 'dpa*.jar' | ? { $_.FullName -inotmatch 'tmp' }).FullName -FilenameToRemove 'JndiLookup.class' } else { Remove-JndiLookup -JarFiles (Get-ChildItem -Exclude 'tmp' -Recurse -Path "$dpa_path" -Filter 'dpa*.jar' | ? { $_.FullName -inotmatch 'tmp' }).FullName -FilenameToRemove 'JndiLookup.class' }
Aby uzyskać pytania lub pomoc w związku z tymi instrukcjami, skontaktuj się z działem pomocy technicznej firmy Dell.