
보안 연구 랩: NationalSecurityAgency/emissary의 고정 스냅샷을 대상으로 GHSA-3g6g-gq4r-xjm9 / CVE-2026-35580(GitHub Actions workflow_dispatch 입력 셸 인젝션)의 통제된 재현
자동화된 연구 산출물 — 업스트림 프로젝트가 아님.
이 저장소는 Université Laval의 석사 논문에서 게시된 GitHub Actions 워크플로우 취약점 재현을 위해 자동화된 하네스가 구축한 일회용 실험실입니다. 이는
NationalSecurityAgency/emissary의 커밋898488b489615581ea66d17954742c8e4ffb0323(2026-01-09) 시점의 그대로의 스냅샷으로, 해당 프로젝트의 자체 라이선스에 따라 재배포되며, 해당 라이선스 파일은 이 스냅샷에 변경 없이 포함되어 있습니다.업스트림 프로젝트는 관여하지 않으며, 결코 대상이 되지 않고, 여기서 연구된 취약점은 이미 공개된 상태입니다. 이 저장소의 모든 비밀과 변수는 무작위로 생성된 더미 값입니다 — 실제 자격 증명은 존재하지 않습니다. 액션 참조와 러너 이미지는 2026-01-09에 확인된 값으로 고정되어 있습니다. 스냅샷에 적용된 모든 변경 사항은 하네스 출력의
pinning.md를 참조하십시오.질문 또는 이의 제기: [email protected]

Emissary는 이기종의, 잠재적으로 광범위하게 분산된, 다중 계층 P2P 컴퓨팅 리소스 네트워크에서 실행되는 P2P 기반 데이터 중심 워크플로우 엔진입니다. 워크플로우 경로는 기존 워크플로우 엔진처럼 사전에 계획되지 않으며, 데이터에 대한 더 많은 정보가 발견됨에 따라 경로가 발견됩니다. Emissary 워크플로우에는 일반적으로 사용자 상호작용이 없으며, 데이터는 완료 상태에 도달할 때까지 목표 지향적인 방식으로 처리됩니다.
Emissary는 고도로 구성 가능하지만, 이 기본 구현에서는 거의 아무것도 수행하지 않습니다. 이 프레임워크의 사용자는 emissary.core.IBaseDataObject 페이로드에 대해 작업을 수행하는 emissary.place.ServiceProviderPlace를 확장하는 클래스를 제공해야 합니다.
다양한 작업을 수행할 수 있으며 워크플로우는 단계별로 관리됩니다. 예: STUDY, ID, COORDINATE, TRANSFORM, ANALYZE, IO, REVIEW.
워크플로우를 지시하는 클래스는 emissary.core.MobileAgent 및 이로부터 파생된 클래스로, 관련 페이로드 객체 집합의 경로를 워크플로우를 통해 관리하며, emissary.directory.DirectoryPlace는 사용 가능한 서비스, 비용 및 품질을 관리하고 P2P 네트워크를 연결 상태로 유지합니다.
필요한 구성 요소 설치, 소스 코드 가져오기, Emissary 빌드 및 실행에 대한 정보는 DEVELOPING.md 가이드를 읽어보십시오.
Emissary를 컴파일, 테스트 및 패키징하려면 mvn clean package를 실행하십시오.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.132 s
[INFO] Finished at: 2022-01-10T22:31:05Z
[INFO] ------------------------------------------------------------------------
Emissary에는 모든 것을 실행하는 bash 스크립트가 하나 있습니다. Emissary 최상위 디렉토리에 있습니다. 이 스크립트는 다양한 기능을 처리하기 위해 여러 Picocli 명령이 있는 emissary.Emissary 클래스를 실행합니다.
emissary 스크립트가 인수 없이 실행되면 모든 구성 하위 명령 목록과 간단한 설명이 표시됩니다.
./emissary
./emissary help를 실행하면 인수 없이 실행할 때와 동일한 출력이 표시됩니다. 명령에 대한 더 자세한 정보를 보려면 help 뒤에 명령 이름을 추가하십시오. 예를 들어, server 명령에 대한 설명이 포함된 모든 인수를 보려면 다음을 실행하십시오:
./emissary help server
나머지 명령에는 모두 설정할 수 있는 (-b 또는 --projectBase) 인수가 있지만 PROJECT_BASE와 일치해야 합니다.
구성 디렉토리는 기본적으로 /config로 설정되지만 *(-c 또는 --config)*로 전달할 수도 있습니다. git 체크아웃에서 실행할 때는 target을 projectBase로 사용해야 합니다. 시작하기 전에 target/config의 구성 파일을 자유롭게 수정하십시오.
로깅은 logback으로 처리됩니다. --logbackConfig 인수로 사용자 지정 파일을 지정할 수 있습니다.
각 명령에 대한 자세한 정보는 *help -c *를 참조하십시오.
이 명령은 Emissary 서버를 시작하고 구성된 모든 place, pickup place 및 drop off 필터를 초기화합니다. -m 또는 --mode가 지정되지 않으면 독립 실행형 모드로 시작됩니다. 기본적으로 MobileAgent 수는 시스템 사양에 따라 계산됩니다. 최신 컴퓨터에서는 이 수가 높을 수 있습니다. -a 또는 --agents로 에이전트 수를 제어할 수 있습니다. 예시 실행은 다음과 같습니다.
./emissary server -a 2
추가 구성 없이 http://localhost:8001에서 시작됩니다. 해당 URL을 탐색하면 target/config/jetty-users.properties에 정의된 사용자 이름과 비밀번호(emissary 및 emissary123)를 입력해야 합니다.
기본 PickUpPlace는 _target/data/InputData_에서 파일을 읽도록 구성되어 있습니다. 해당 디렉토리에 파일을 복사하면 Emissary가 처리하는 것을 볼 수 있습니다. toUpper와 toLower만 구성되어 있으므로 출력은 그다지 흥미롭지 않을 것입니다.
서비스가 작업을 수행하지 못하도록 중지합니다.
./emissary server --pause
일시 중지된 서비스가 작업을 수행하도록 허용합니다.
./emissary server --unpause
새로 고칠 수 있는 서비스를 무효화합니다. 이는 ServiceProviderRefreshablePlace를 무효화하는 무중단 방식의 "가벼운" 새로 고침입니다. place가 DirectoryPlace에서 가져와지면 동일한 키로 DirectoryPlace 및 Namespace에 대해 place가 다시 생성되지만 구성 로더가 다시 로드되고 place는 구성의 하위 집합을 다시 로드할 수 있습니다.
./emissary server --invalidate
서비스의 강제 새로 고침을 수행합니다. 이는 "하드" 새로 고침으로, 서버가 일시 중지되고 MobileAgent가 모두 소진될 때까지 대기합니다. 서버가 완전히 유휴 상태가 되면 모든 ServiceProviderRefreshablePlace 기존 키가 DirectoryPlace 및 Namespace에서 제거되고 place가 완전히 다시 생성됩니다. 이를 통해 서비스 이름, 프록시, 거부 목록 등의 변경이 가능합니다. 그런 다음 서버가 일시 중지 해제되어 처리를 재개합니다. 새로 고침 중 오류가 발생하면 서버가 잘못된 상태가 될 수 있으므로 서버가 종료됩니다.
./emissary server --refresh
서비스를 종료합니다.
./emissary server --stop
서비스를 강제로 종료합니다.
./emissary server --kill
agents 명령은 구성된 호스트의 MobileAgent 수와 해당 에이전트가 수행 중인 작업을 표시합니다. 기본적으로 포트는 9001이지만 -p 또는 --port로 변경할 수 있습니다. 위의 server 명령에서 8001에서 실행 중이라고 가정하고 다음을 시도하십시오:
./emissary agents -p 8001
Pool은 노드의 에이전트를 축약된 보기로 표시합니다. 역시 기본적으로 포트 9001을 사용합니다. 위에서 시작한 독립 실행형 서버에 대해 실행하려면 다음을 실행하십시오.
./emissary pool -p 8001
이 명령은 모든 노드에 대한 더 이해하기 쉬운 보기를 제공하므로 클러스터에서 더 유용합니다.
Env 명령은 실행 중인 서버가 필요합니다. 서버에 PROJECT_BASE 및 BIN_DIR과 같은 일부 구성 값을 요청합니다. 인수 없이 실행하면 형식화되지 않은 json 응답을 덤프합니다.
./emissary env
하지만 bash에서 소싱하기에 적합한 응답을 덤프할 수도 있습니다.
./emissary env --bashable
Emissary 서버를 시작하면 실제로 이 엔드포인트를 호출하고 구성된 변수로 $PROJECT_BASE}/env.sh를 덤프합니다. 이는 셸 스크립트가 source $PROJECT_BASE}/env.sh를 수행한 다음 다른 곳에서 구성할 필요 없이 해당 변수를 사용할 수 있도록 하기 위한 것입니다.