
Laboratorio de investigación en seguridad que reproduce CVE-2020-36762 (GHSA-h9gr-83jq-f3xc): inyección de comandos bash a través de github.event.comment.body en el flujo de trabajo de comentarios de ONSdigital/ras-collection-instrument
Artefacto de investigación automatizado — no es el proyecto original.
Este repositorio es un laboratorio desechable construido por un sistema automatizado para una tesis de maestría en la Université Laval sobre la reproducción de vulnerabilidades publicadas en flujos de trabajo de GitHub Actions. Es una instantánea verbatim de
ONSdigital/ras-collection-instrumenten el commit493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03), redistribuida bajo la licencia del propio proyecto, cuyo archivo se incluye sin cambios en esta instantánea.El proyecto original no está involucrado, nunca es el objetivo, y la vulnerabilidad estudiada aquí ya es pública. Cada secreto y variable en este repositorio es un valor ficticio generado aleatoriamente — no hay ninguna credencial real. Las referencias de acciones y las imágenes de ejecutores están fijadas a lo que resolvieron el 2020-12-03; consulte
pinning.mden la salida del sistema para cada cambio realizado en la instantánea.Preguntas u objeciones: [email protected]
Este es el microservicio RAS Collection Instrument, responsable de la carga de ejercicios e instrumentos de recolección. También se puede utilizar para descargar instrumentos de recolección como archivos .xlsx, y permite la búsqueda de instrumentos de recolección mediante filtros de búsqueda. Este servicio tiene la capacidad de vincular y desvincular ejercicios de recolección con instrumentos de recolección. La relación entre ejercicios e instrumentos es de uno a muchos, por lo que un ejercicio de recolección puede tener múltiples instrumentos de recolección. Cada instrumento de recolección en el esquema JSON tiene una referencia de unidad de muestra, tipo e ID de resumen, así como atributos adicionales. Este servicio se comunica principalmente con el servicio de ejercicios de recolección, así como con los servicios de parte, caso y encuesta. La información de registro sobre los instrumentos de recolección se envía a rabbitmq.
Los instrumentos de recolección se almacenan en una tabla de instrumentos con los siguientes campos:
type = el tipo del ejercicio de recolección (es decir, SEFT, EQ, etc.) instrument_id = el UUID del instrumento stamp = la marca de tiempo que muestra cuándo se creó el instrumento de recolección survey_id = el UUID de la encuesta asociada classifiers = los clasificadores de la encuesta survey = la encuesta en sí seft_file = el archivo seft del instrumento
Existen tres vistas de endpoints diferentes: /collectioninstrument, que se utiliza para la mayoría de los endpoints, así como /survey_responses y /info.
Cuando se carga un instrumento de recolección para un ejercicio de recolección, escribe un mensaje en la cola Seft.Instruments para el servicio rm-collection-exercise Cuando se carga una respuesta de encuesta SEFT, escribe un mensaje en la cola Seft.Responses para el servicio sdx-seft-consumer
Esto requiere que pipenv esté instalado:
pip install pipenv
Para ejecutar las pruebas se requiere un servidor de rabbitmq y de base de datos. El script tox crea y ejecuta estas dependencias dentro de contenedores Docker, que se destruyen después de que se ejecutan las pruebas unitarias.
pipenv install --dev
pipenv run tox
Para ejecutar el servicio con las dependencias requeridas:
docker-compose up -d db rabbitmq
pipenv run python run.py
Para probar que el servicio está activo:
curl http://localhost:8082/info
La base de datos se creará automáticamente al iniciar la aplicación.
Para ejecutar el servicio en un contenedor Docker se incluye un script Compose:
docker-compose up -d
Las variables de entorno disponibles para la configuración se enumeran a continuación:
| Environment Variable | Description | Default |
|---|---|---|
| MAX_UPLOAD_FILE_NAME_LENGTH | Maximum length of file names | 50 |
| LOGGING_LEVEL | Level of the logger | INFO |
| JSON_SECRET_KEYS | Json representation of keys | None |
| ONS_CRYPTOKEY | A key used by the Cryptographer | None |
| SECURITY_USER_NAME | Username the client uses to authenticate with other apis | admin |
| SECURITY_USER_PASSWORD | Password the client uses to authenticate with other apis | secret |
| COLLECTION_EXERCISE_SCHEMA | Location of the collection instrument schema | application/schemas/collection_instrument_schema.json |
| CASE_URL | URL for the case service | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | URL for the collection exercise service | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | URL for the survey service | 'http://localhost:8080' |
| PARTY_URL | URL for the party service | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | URI for rabbitmq | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | URI for rabbitmq | None |
Estas se establecen en config.py
Navegue a /developer_scripts y ejecute import.py, responda las indicaciones en la línea de comandos
collection_instrument_schema tiene dos campos de atributos aparentemente idénticos: formType y formtype.entname1/2/3 y runame1/2/3, entre otros. El esquema debería rediseñarse o tener documentación más específica./collectioninstrument/count es devolver el número de instrumentos de recolección. ¿Por qué es algo que el servicio necesita hacer? ¿No podría lograrse esto con una consulta a la base de datos?