Kritická a závažné zraniteľnosti OpenPLC

Kyberbezpečnostná jednotka Talos spoločnosti Cisco zverejnila podrobnosti o viacerých opravených zraniteľnostiach v programovateľnom logickom ovládači OpenPLC, ktoré možno zneužiť pri útokoch DoS a na vzdialené vykonávanie kódu.

Zraniteľné systémy:

  • OpenPLC _v3 b4702061dc14d1024856f71b4543298d77007b88
  • OpenPLC _v3 16bf8bac1a36d95b73e7b8722d0edb8b9c5bb56a

Opis činnosti:

CVE-2024-34026 (CVSS skóre 9,8)

Kritická zraniteľnosť označená ako CVE-2024-34026 sa nachádza v parseri EtherNet/IP  prostredia OpenPLC Runtime (verzia OpenPLV_v3 b4702061dc14d1024856f71b4543298d77007b88).  Chyba spočíva v nedostatočnej kontrole veľkosti alokovanej pamäte pre uloženie záznamu o požiadavke, čo vedie k možnosti spôsobiť pretečenie zásobníka. Útočník môže odoslať špeciálne vytvorenú sériu požiadaviek EtherNet/IP, a tak získať schopnosť vzdialene vykonávať kód.

CVE-2024-36980, CVE-2024-36981, CVE-2024-39589, CVE-2024-39590 (CVSS skóre 7,5)

Zraniteľnosti sa nachádzajú v parseri EtherNet/IP PCCC prostredia OpenPLC Runtime. Odoslaním špeciálne vytvorených požiadaviek EtherNet/IP môže útočník spôsobiť odmietnutie služby (DoS).

  • CVE-2024-36980 a CVE-2024-36981 (OpenPLC _v3 b4702061dc14d1024856f71b4543298d77007b88) umožňujú čítanie mimo povolený rozsah pamäte.
  • CVE-2024-39589 a CVE-2024-39590 (OpenPLC _v3 16bf8bac1a36d95b73e7b8722d0edb8b9c5bb56a) súvisia s nesprávnou dereferenciou ukazovateľa.

Možné škody:

  • Nedostupnosť služby (DoS)
  • Vzdialené vykonávanie kódu

Odporúčania:

Bezodkladná aktualizácia na najnovšiu verziu OpenPLC.
Pokiaľ nemôžete aktualizovať na najnovšiu verziu, Cisco Talos odporúča pre zraniteľnosti CVE-2024-36981 a CVE-2024-36980 upraviť zdrojový kód tak, aby sa v dotknutom porovnávaní typ -1 zmenil na zodpovedajúci typ.

uint16_t newPcccSize = processPCCCMessage(pcccData, currentPcccSize);
if (newPcccSize == (uint16_t) -1)
return -1;

Pre zmiernenie zraniteľností CVE-2024-39589 a CVE-2024-39590 upravte zdrojový kód tak, aby ste odstránili tri pretypovania ukazovateľov vo volaniach Protected_Logical_Write_Reply memmove.

memmove(&buffer[0], header.RP_CMD_Code, 1);
memmove(&buffer[1], header.HD_Status, 1);
memmove(&buffer[2], header.HD_TransactionNum, 2);

Odkazy: