
Лаборатория исследований безопасности, воспроизводящая CVE-2020-36762 (GHSA-h9gr-83jq-f3xc): внедрение bash-команд через github.event.comment.body в workflow комментариев ONSdigital/ras-collection-instrument
Автоматически созданный исследовательский артефакт — не вышестоящий проект.
Этот репозиторий — одноразовая лабораторная среда, созданная автоматизированным конвейером для магистерской диссертации в Université Laval по воспроизведению опубликованных уязвимостей рабочих процессов GitHub Actions. Это дословный снимок
ONSdigital/ras-collection-instrumentна коммите493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03), распространённый под собственной лицензией этого проекта, файл которой включён в этот снимок без изменений.Вышестоящий проект не участвует, никогда не является целью, а изучаемая здесь уязвимость уже публична. Каждый секрет и переменная в этом репозитории — случайно сгенерированные фиктивные значения — никаких реальных учётных данных здесь нет. Ссылки на действия и образы раннеров закреплены на те значения, которые они имели на 2020-12-03; см.
pinning.mdв выводе конвейера для каждого изменения, внесённого в снимок.Вопросы или возражения: [email protected]
Это микросервис RAS Collection Instrument, отвечающий за загрузку упражнений по сбору данных и инструментов сбора. Его также можно использовать для загрузки инструментов сбора в виде файлов .xlsx, а также он позволяет искать инструменты сбора с помощью фильтров поиска. Этот сервис имеет возможность связывать и отвязывать упражнения по сбору данных от инструментов сбора. Связь между упражнениями и инструментами — «один ко многим», то есть одно упражнение по сбору данных может иметь несколько инструментов сбора. Каждый инструмент сбора в JSON-схеме имеет ссылку на единицу выборки, тип и идентификатор сводки, а также дополнительные атрибуты. Этот сервис взаимодействует в первую очередь с сервисом упражнений по сбору данных, а также с сервисами party, case и survey. Информация журналирования об инструментах сбора отправляется в rabbitmq.
Инструменты сбора хранятся в таблице инструментов со следующими полями:
type = тип упражнения по сбору данных (например, SEFT, EQ и т. д.) instrument_id = UUID инструмента stamp = временная метка, показывающая, когда был создан инструмент сбора survey_id = UUID связанного обследования classifiers = классификаторы обследования survey = само обследование seft_file = файл SEFT инструмента
Существуют три различные конечные точки представления: /collectioninstrument, которая используется для большинства конечных точек, а также /survey_responses и /info.
Когда инструмент сбора загружается для упражнения по сбору данных, он записывает сообщение в очередь Seft.Instruments для сервиса rm-collection-exercise. Когда загружается ответ на обследование SEFT, он записывает сообщение в очередь Seft.Responses для сервиса sdx-seft-consumer.
Для этого требуется установленный 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 | URL сервиса case | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | URL сервиса упражнений по сбору данных | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | URL сервиса обследований | 'http://localhost:8080' |
| PARTY_URL | URL сервиса party | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | URI для rabbitmq | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | URI для rabbitmq | None |
Они задаются в config.py
Перейдите в /developer_scripts и запустите import.py, отвечайте на запросы в командной строке
collection_instrument_schema есть два, казалось бы, идентичных поля атрибутов: formType и formtype.entname1/2/3 и runame1/2/3, среди прочих. Схему следует переработать или снабдить более подробной документацией./collectioninstrument/count просто возвращает количество инструментов сбора. Зачем сервису это нужно? Разве это нельзя сделать запросом к базе данных?