
Laboratório de pesquisa em segurança reproduzindo CVE-2020-36762 (GHSA-h9gr-83jq-f3xc): injeção de comandos bash via github.event.comment.body no fluxo de trabalho de comentários de ONSdigital/ras-collection-instrument
Artefacto de investigação automatizado — não é o projeto original.
Este repositório é um laboratório descartável construído por um sistema automatizado para uma dissertação de mestrado na Université Laval sobre a reprodução de vulnerabilidades publicadas em workflows do GitHub Actions. É um instantâneo verbatim de
ONSdigital/ras-collection-instrumentno commit493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03), redistribuído sob a licença do próprio projeto, cujo ficheiro está incluído inalterado neste instantâneo.O projeto original não está envolvido, nunca é alvo, e a vulnerabilidade estudada aqui já é pública. Todos os segredos e variáveis neste repositório são valores fictícios gerados aleatoriamente — nenhuma credencial real está presente. As referências de ações e imagens de runners estão fixadas no que resolviam em 2020-12-03; consulte
pinning.mdna saída do harness para todas as alterações feitas ao instantâneo.Perguntas ou objeções: [email protected]
Este é o micro-serviço RAS Collection Instrument, responsável pelo carregamento de exercícios de recolha e instrumentos. Também pode ser usado para descarregar instrumentos de recolha como ficheiros .xlsx, e permite a pesquisa de instrumentos de recolha através de filtros de pesquisa. Este serviço tem a capacidade de ligar e desligar exercícios de recolha com instrumentos de recolha. A relação entre exercícios e instrumentos é de um-para-muitos, portanto um exercício de recolha pode ter vários instrumentos de recolha. Cada instrumento de recolha no esquema JSON tem uma referência de unidade de amostra, tipo e ID de resumo, bem como atributos adicionais. Este serviço comunica principalmente com o serviço de exercícios de recolha, bem como com os serviços de parte, caso e inquérito. As informações de registo sobre os instrumentos de recolha são enviadas para o rabbitmq.
Os instrumentos de recolha são armazenados numa tabela de instrumentos com os seguintes campos:
type = o tipo do exercício de recolha (ou seja, SEFT, EQ, etc.) instrument_id = o UUID do instrumento stamp = o timestamp que mostra quando o instrumento de recolha foi criado survey_id = o UUID do inquérito associado classifiers = os classificadores do inquérito survey = o próprio inquérito seft_file = o ficheiro seft do instrumento
Existem três vistas de endpoints diferentes: /collectioninstrument, que é usada para a maioria dos endpoints, bem como /survey_responses e /info.
Quando um instrumento de recolha é carregado para um exercício de recolha, escreve uma mensagem na fila Seft.Instruments para o serviço rm-collection-exercise Quando uma resposta de inquérito SEFT é carregada, escreve uma mensagem na fila Seft.Responses para o serviço sdx-seft-consumer
Isto requer que o pipenv esteja instalado:
pip install pipenv
Para executar os testes, é necessário um servidor rabbitmq e de base de dados. O script tox cria e executa estas dependências dentro de contentores Docker, que são destruídos após a execução dos testes unitários.
pipenv install --dev
pipenv run tox
Para executar o serviço com as dependências necessárias:
docker-compose up -d db rabbitmq
pipenv run python run.py
Para testar se o serviço está ativo:
curl http://localhost:8082/info
A base de dados será criada automaticamente ao iniciar a aplicação.
Para executar o serviço num contentor Docker, está incluído um script Compose:
docker-compose up -d
As variáveis de ambiente disponíveis para configuração estão listadas abaixo:
| Environment Variable | Description | Default |
|---|---|---|
| MAX_UPLOAD_FILE_NAME_LENGTH | Comprimento máximo dos nomes de ficheiros | 50 |
| LOGGING_LEVEL | Nível do logger | INFO |
| JSON_SECRET_KEYS | Representação JSON das chaves | None |
| ONS_CRYPTOKEY | Uma chave usada pelo Cryptographer | None |
| SECURITY_USER_NAME | Nome de utilizador que o cliente usa para autenticar com outras APIs | admin |
| SECURITY_USER_PASSWORD | Palavra-passe que o cliente usa para autenticar com outras APIs | secret |
| COLLECTION_EXERCISE_SCHEMA | Localização do esquema do instrumento de recolha | application/schemas/collection_instrument_schema.json |
| CASE_URL | URL para o serviço de casos | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | URL para o serviço de exercícios de recolha | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | URL para o serviço de inquéritos | 'http://localhost:8080' |
| PARTY_URL | URL para o serviço de partes | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | URI para o rabbitmq | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | URI para o rabbitmq | None |
Estas estão definidas em config.py
Navegue até /developer_scripts e execute import.py, responda aos prompts na linha de comandos
collection_instrument_schema tem dois campos de atributos aparentemente idênticos: formType e formtype.entname1/2/3 e runame1/2/3, entre outros. O esquema deveria ser redesenhado, ou ter documentação mais específica./collectioninstrument/count apenas devolve o número de instrumentos de recolha. Porque é que isto é algo que o serviço precisa de fazer? Não poderia ser feito por uma consulta à base de dados?