
보안 연구 랩으로, CVE-2020-36762(GHSA-h9gr-83jq-f3xc)를 재현합니다: ONSdigital/ras-collection-instrument의 comment 워크플로우에서 github.event.comment.body를 통한 bash 명령어 주입
자동화된 연구 산출물 — 상위 프로젝트가 아님.
이 저장소는 Université Laval의 석사 논문에서 게시된 GitHub Actions 워크플로우 취약점을 재현하기 위해 자동화된 하네스가 구축한 일회용 실험실입니다. 이는 커밋
493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03) 시점의ONSdigital/ras-collection-instrument의 축어적 스냅샷으로, 해당 프로젝트의 자체 라이선스에 따라 재배포되며, 해당 라이선스 파일은 이 스냅샷에 변경 없이 포함되어 있습니다.상위 프로젝트는 관여하지 않으며, 결코 대상이 되지 않고, 여기서 연구된 취약점은 이미 공개된 것입니다. 이 저장소의 모든 비밀값과 변수는 무작위로 생성된 더미 값입니다 — 실제 자격 증명은 존재하지 않습니다. 액션 참조와 러너 이미지는 2020-12-03에 확인된 값으로 고정되어 있습니다. 스냅샷에 적용된 모든 변경 사항은 하네스 출력의
pinning.md를 참조하십시오.질문 또는 이의 제기: [email protected]
이것은 RAS Collection Instrument 마이크로서비스로, 수집 연습(collection exercise)과 도구(instrument)의 업로드를 담당합니다. 또한 수집 도구를 .xlsx 파일로 다운로드하는 데 사용할 수 있으며, 검색 필터를 통한 수집 도구 검색도 지원합니다. 이 서비스는 수집 연습과 수집 도구를 연결 및 연결 해제하는 기능을 가지고 있습니다. 연습과 도구 간의 관계는 일대다(one-to-many)이므로, 하나의 수집 연습은 여러 수집 도구를 가질 수 있습니다. JSON 스키마의 각 수집 도구에는 샘플 단위 참조, 유형, 요약 ID 및 추가 속성이 있습니다. 이 서비스는 주로 수집 연습 서비스와 통신하며, party, case 및 survey 서비스와도 통신합니다. 수집 도구에 대한 로깅 정보는 rabbitmq로 전송됩니다.
수집 도구는 다음 필드가 있는 도구 테이블에 저장됩니다:
type = 수집 연습의 유형 (예: SEFT, EQ 등) instrument_id = 도구의 UUID stamp = 수집 도구가 생성된 시점을 보여주는 타임스탬프 survey_id = 관련 설문의 UUID classifiers = 설문 분류자 survey = 설문 자체 seft_file = 도구의 seft 파일
세 가지 다른 엔드포인트 뷰가 존재합니다: 대부분의 엔드포인트에 사용되는 /collectioninstrument, 그리고 /survey_responses 및 /info.
수집 연습에 대해 수집 도구가 업로드되면 rm-collection-exercise 서비스를 위해 Seft.Instruments 큐에 메시지를 작성합니다. SEFT 설문 응답이 업로드되면 sdx-seft-consumer 서비스를 위해 Seft.Responses 큐에 메시지를 작성합니다.
이를 위해서는 pipenv가 설치되어 있어야 합니다:
pip install pipenv
테스트를 실행하려면 rabbitmq 및 데이터베이스 서버가 필요합니다. tox 스크립트는 이러한 종속성을 Docker 컨테이너 내부에서 생성하고 실행하며, 단위 테스트가 실행된 후에는 컨테이너가 삭제됩니다.
pipenv install --dev
pipenv run tox
필요한 종속성과 함께 서비스를 실행하려면:
docker-compose up -d db rabbitmq
pipenv run python run.py
서비스가 실행 중인지 테스트하려면:
curl http://localhost:8082/info
데이터베이스는 애플리케이션 시작 시 자동으로 생성됩니다.
Docker 컨테이너에서 서비스를 실행하려면 Compose 스크립트가 포함되어 있습니다:
docker-compose up -d
구성에 사용할 수 있는 환경 변수는 아래에 나열되어 있습니다:
| 환경 변수 | 설명 | 기본값 |
|---|---|---|
| MAX_UPLOAD_FILE_NAME_LENGTH | 파일 이름의 최대 길이 | 50 |
| LOGGING_LEVEL | 로거의 수준 | INFO |
| JSON_SECRET_KEYS | 키의 Json 표현 | None |
| ONS_CRYPTOKEY | Cryptographer가 사용하는 키 | None |
| SECURITY_USER_NAME | 클라이언트가 다른 API와 인증할 때 사용하는 사용자 이름 | admin |
| SECURITY_USER_PASSWORD | 클라이언트가 다른 API와 인증할 때 사용하는 비밀번호 | secret |
| COLLECTION_EXERCISE_SCHEMA | 수집 도구 스키마의 위치 | application/schemas/collection_instrument_schema.json |
| CASE_URL | case 서비스의 URL | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | 수집 연습 서비스의 URL | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | survey 서비스의 URL | 'http://localhost:8080' |
| PARTY_URL | party 서비스의 URL | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | rabbitmq의 URI | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | rabbitmq의 URI | None |
이 값들은 config.py에 설정되어 있습니다.
/developer_scripts로 이동하여 import.py를 실행하고, 명령줄의 프롬프트에 응답하십시오.
collection_instrument_schema에는 겉보기에 동일한 두 개의 속성 필드가 있습니다: formType 및 formtype.entname1/2/3 및 runame1/2/3 등과 같이 이름과 목적이 불명확합니다. 스키마는 재설계되거나 더 구체적인 문서가 있어야 합니다./collectioninstrument/count 엔드포인트가 하는 일은 수집 도구의 수를 반환하는 것뿐입니다. 서비스가 이 작업을 수행해야 하는 이유는 무엇입니까? 데이터베이스 쿼리로 해결할 수 없습니까?