carbon-footprint-program

Проекты, которые следуют приведенным ниже лучшим практикам, могут добровольно и самостоятельно оценить себя и продемонстрировать, что они получили значок Open Source Security Foundation (OpenSSF).

Не существует набора практик, гарантирующего, что у программного обеспечения никогда не будет недостатков или уязвимостей; даже формальные методы могут не помочь, если спецификации или допущения ошибочны. Также не существует какой-либо практики, которая могла бы гарантировать, что проект будет поддерживать здоровое и хорошо функционирующее сообщество разработчиков. Однако следующие хорошие правила могут помочь улучшить результаты проектов. Например, некоторые правила описывают ревью несколькими участниками перед выпуском, что может помочь найти технические уязвимости, которые было бы сложно найти другим способом, и помочь построить доверие и желание дальнейшего взаимодействия между разработчиками из разных компаний. Чтобы получить значок, нужно выполнить все критерии с ключевыми словами "НЕОБХОДИМО"/"ОБЯЗАН"/"НЕДОПУСТИМО", все критерии со словом "СЛЕДУЕТ" либо должны удовлетворяться, либо должно быть приведено обоснование их невыполнения, и все критерии со словом "ЖЕЛАТЕЛЬНО" могут быть удовлетворены ИЛИ неудовлетворены (желательно, чтобы они были хотя бы рассмотрены). Если вы хотите ввести общий комментарий вместо объяснения, почему текущая ситуация приемлема, начните текст с '//' и пробела. Приветствуется обратная связь через сайт на GitHub в виде issues или pull requests. Существует также список рассылки для общих вопросов.

Мы с удовольствием предоставляем информацию на нескольких языках, однако, если есть какой-либо конфликт или несоответствие между переводами, английская версия является авторитетной.
Если это ваш проект, пожалуйста, покажите свой значок на странице проекта! Статус значка выглядит следующим образом: Уровень значка для проекта 13873 - passing Вот как вставить его:
Вы можете показать свой статус значка, вставив его в файл с разметкой Markdown:
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13873/badge)](https://www.bestpractices.dev/projects/13873)
- или HTML:
<a href="https://www.bestpractices.dev/projects/13873"><img src="https://www.bestpractices.dev/projects/13873/badge"></a>


Это критерии уровня Passing. Вы также можете просмотреть критерии уровня Silver или Gold.

Baseline Series: Базовый уровень 1 Базовый Уровень 2 Базовый Уровень 3

        

 Основы 13/13

  • Общая

    Обратите внимание, что другие проекты могут использовать то же имя.

    Huella Latam is a digital public good for Latin America that lets organizations and governments measure, manage and reduce their carbon footprints. Organizations build greenhouse-gas inventories from activity data using country-configurable emission factors and methodologies, submit them for verification, and track reduction plans; national administrators manage catalogs, methodologies, users and sector-level reporting. It is a TypeScript monorepo — a Fastify + Prisma + PostgreSQL API, a React + Vite web app, shared libraries, and Azure Bicep infrastructure — released under AGPL-3.0 and owned by the United Nations Development Programme (UNDP). The platform is country-agnostic by design: country-specific values live in configuration and seed data so each adopting country can run its own deployment.

    Используйте формат выражения лицензии SPDX; примеры включают «Apache-2.0», «BSD-2-Clause», «BSD-3-Clause», «GPL-2.0+», «LGPL-3.0+», «MIT» и «(BSD-2-Clause OR Ruby)».
    Если используется более одного языка, перечислите их через запятую (пробелы необязательны), и отсортируйте их от наиболее до наименее используемого. Если список длинный, пожалуйста, перечислите по крайней мере три наиболее распространенных. Если языка нет (например, это проект только для документации или только для тестирования), используйте один символ «-» (минус). Для каждого языка используйте общепринятую капитализацию названия, например «JavaScript».
    Common Platform Enumeration (CPE) - это структурированная схема именования для информационных систем, программного обеспечения и пакетов. Она используется в ряде систем и баз данных для отчетов об уязвимостях.
  • Основная информация на веб-сайте проекта


    Веб-сайт проекта ОБЯЗАН кратко описывать, что делает программное обеспечение (какую проблему решает?). [description_good]
    Описание ОБЯЗАНО быть на языке, который могут понять потенциальные пользователи (например, с минимумом жаргона).

    The README opens with a one-line description — "Huella Latam: a platform (digital public good for Latin America) for measuring, managing, and reducing carbon footprints" — followed by an architecture summary, an SDG-relevance section, and a documentation index. See https://github.com/undp/carbon-footprint-program#readme and https://github.com/undp/carbon-footprint-program/blob/main/docs/overview/project-overview.md



    Веб-сайт проекта ОБЯЗАН предоставлять информацию о том, как: получать и предоставлять обратную связь (например, отчеты об ошибках или улучшения) и вносить свой вклад в программное обеспечение. [interact]

    The README "Quick start" section explains how to obtain, build and run the software; CONTRIBUTING.md explains how to give feedback and contribute; .github/SUPPORT.md routes questions, bug reports, feature requests, security reports and privacy concerns to the right channel. https://github.com/undp/carbon-footprint-program/blob/main/.github/SUPPORT.md



    В описании того, как сделать вклад, НЕОБХОДИМО объяснить процесс внесения вклада (например, используются ли pull request'ы). (Требуется URL) [contribution]
    Мы предполагаем, что проекты на GitHub используют issues и pull requests, если не указано иное. Описание может быть кратким, например, указывать, что проект использует pull requests, issue tracker или сообщения в список рассылки (какой?).

    Non-trivial contribution file in repository: https://github.com/undp/carbon-footprint-program/blob/main/CONTRIBUTING.md. It covers the Code of Conduct, licensing of contributions (AGPL-3.0), how to report bugs and request features, development setup, and the pull-request process. A detailed technical workflow (branch naming, commit conventions, local database, testing) is at https://github.com/undp/carbon-footprint-program/blob/main/docs/development/contributing.md.



    В информацию о том, как внести вклад, СЛЕДУЕТ включать требования к приемлемым взносам (например, ссылку на любой требуемый стандарт кодирования). (Требуется URL) [contribution_requirements]

    CONTRIBUTING.md documents the acceptance criteria explicitly: https://github.com/undp/carbon-footprint-program/blob/main/CONTRIBUTING.md#contribution-acceptance-criteria — country-agnosticism, backward compatibility for existing country deployments, integration tests for new features, documentation updates, and an explicit maintainer security review for changes to auth, authorization, file upload or DB queries. It also requires branch prefixes (feat/fix/refactor/docs/chore/infra), Conventional Commits, small modular commits, and that CI (lint, type-check, format, test, build) pass. A pull-request template is provided at https://github.com/undp/carbon-footprint-program/blob/main/.github/PULL_REQUEST_TEMPLATE.md.


  • Свободная лицензия


    ПО, создаваемое проектом, ОБЯЗАНО быть выпущено под свободной лицензией. [floss_license]
    Свободное ПО (далее СПО) - это программное обеспечение, которое соответствует Определению Открытого ПО (официальный текст на англ.) или Определению Свободного Программного Обеспечения. Примеры таких лицензий включают CC0, MIT, BSD 2-Clause, BSD 3-Clause, Apache 2.0, Меньшая стандартная общественная лицензия GNU (LGPL) и Стандартная общественная лицензия GNU (GPL). Для наших целей это означает, что лицензия ОБЯЗАНА быть: ПО МОЖЕТ одновременно лицензироваться на других условиях (например, приемлема комбинация «GPLv2 или закрытая лицензия»).

    The project is released under the GNU Affero General Public License v3.0 only (SPDX: AGPL-3.0-only), declared in the root LICENSE file and in the "license" field of every package.json. AGPL-3.0 is approved by the Open Source Initiative (OSI) and by the Digital Public Goods Alliance.



    ЖЕЛАТЕЛЬНО, чтобы все лицензии для ПО, создаваемого проектом, были одобрены Open Source Initiative (OSI). [floss_license_osi]
    Для одобрения OSI используется строгий процесс, чтобы определить, какие лицензии соответствуют Открытому ПО.

    The AGPL-3.0 license is approved by the Open Source Initiative (OSI).



    Проект ОБЯЗАН публиковать лицензию или лицензии своих результатов в стандартном расположении в своем репозитории исходного кода. (Требуется URL) [license_location]
    Например, в качестве файла верхнего уровня с именем LICENSE или COPYING. Имена файлов лицензии МОГУТ сопровождаться расширением, таким как «.txt» или «.md». Другим соглашением может быть наличие каталога с именем LICENSES, содержащего файлы лицензий; имена этих файлов обычно соответствуют SPDX-идентификатору лицензии, за которым следует соответствующее расширение файла, как описано в спецификации REUSE . Обратите внимание, что этот критерий является обязательным только для репозитория с исходным кодом. Вам НЕ нужно включать файл лицензии при генерации чего-либо из исходного кода (например, исполняемого файла, пакета или контейнера). Например, при создании пакета R для Comprehensive R Archive Network (CRAN) рекомендуется следовать стандартной практике CRAN: если лицензия является стандартной, используйте стандартную короткую спецификацию лицензии (чтобы избежать установки еще одной копии текста) и добавьте файл LICENSE в списке исключений, например .Rbuildignore. Аналогично, при создании пакета Debian вы можете поместить в файл copyright ссылку на текст лицензии в /usr/share/common-licenses и исключить файл лицензии из созданного пакета (например, удаляя файл после вызова dh_auto_install). Мы рекомендуем включать машиночитаемую информацию о лицензии в сгенерированных форматах, где это возможно.

    Non-trivial license location file in repository: https://github.com/undp/carbon-footprint-program/blob/main/LICENSE — the full AGPL-3.0 text in the standard root LICENSE file. GitHub detects the license as "GNU Affero General Public License v3.0".


  • Документация


    Проект ОБЯЗАН предоставлять базовую документацию для программного обеспечения, создаваемого проектом. [documentation_basics]
    Эта документация должна быть в некоторых формах (таких как текст или видео), которые включают в себя: как установить программное обеспечение, как его запустить, как его использовать (возможно, с помощью учебника с примерами) и как использовать его безопасно (например, что делать и чего не делать), если эти темы применимы для данного программного обеспечения. Документация по безопасности не обязательно должна быть длинной. Проект МОЖЕТ использовать гипертекстовые ссылки для не-проектных материалов в качестве документации. Если проект не создает программное обеспечение, выберите «неприменимо» (N/A).

    Documentation lives under docs/ with an index at https://github.com/undp/carbon-footprint-program/blob/main/docs/README.md. It covers architecture (system-architecture.md, tech-stack.md, codebase-map.md, emission-calculation.md), the data model (developer-guide.md, ER diagram), development (local-setup.md, api-conventions.md, testing.md, environment-variables.md, contributing.md), operations (admin-guide.md, production-deployment.md, observability.md), infrastructure/deployment, security, and release/versioning. A separate end-user manual is maintained under user_manual/.



    Проект ОБЯЗАН предоставлять справочную документацию, описывающую внешний интерфейс (как входной, так и выходной) программного обеспечения, создаваемого проектом. [documentation_interface]
    Документация внешнего интерфейса объясняет конечному пользователю или разработчику, как его использовать. Это может включать в себя интерфейс прикладного программирования (API), если программное обеспечение его имеет. Если это библиотека, документируйте основные классы/типы и методы/функции, которые можно вызвать. Если это веб-приложение, определите его URL-интерфейс (часто его интерфейс REST). Если это интерфейс командной строки, документируйте параметры и настройки, которые он поддерживает. Во многих случаях лучше всего, если большая часть этой документации будет автоматически сгенерирована, чтобы эта документация была синхронизирована с программным обеспечением по мере его изменения, но это не требуется. Проект МОЖЕТ использовать гипертекстовые ссылки для не-проектных материалов в качестве документации. Документация МОЖЕТ быть автоматически сгенерирована (там, где это применимо, это часто наилучший способ создания документации). Документация интерфейса REST может быть сгенерирована с использованием Swagger/OpenAPI. Документация по интерфейсу кода МОЖЕТ быть сгенерирована с использованием таких инструментов, как JSDoc (JavaScript), ESDoc (JavaScript), pydoc (Python), devtools (R), pkgdown (R) и Doxygen (многие языки). Просто иметь комментарии в коде реализации недостаточно для выполнения этого критерия; должен быть простой способ увидеть информацию без чтения всего исходного кода. Если проект не создает программное обеспечение, выберите «неприменимо» (N/A).

    The HTTP API is self-documenting via @fastify/swagger + @fastify/swagger-ui, which publish an OpenAPI specification and interactive docs at /api/docs (locally http://localhost:8080/api/docs). Route schemas are Zod-derived, so the published OpenAPI document is generated from the same schemas the API validates against. Conventions for the external interface are documented at https://github.com/undp/carbon-footprint-program/blob/main/docs/development/api-conventions.md.


  • Другое


    Сайты проекта (веб-сайт, репозиторий и URL-адреса для загрузки) ОБЯЗАНЫ поддерживать HTTPS с использованием TLS. [sites_https]
    Для выполнения этого критерия требуется, чтобы URL домашней страницы проекта начинался с "https:", а не "http:". Вы можете получить бесплатные сертификаты от проекта Let's Encrypt. Проекты МОГУТ выполнить этот критерий, используя (например) GitHub Pages, GitLab Pages или проектные страницы SourceForge. Если вы поддерживаете HTTP, мы настоятельно рекомендуем перенаправить HTTP-трафик на HTTPS.

    All project sites are HTTPS-only. The repository and its documentation are served by GitHub over HTTPS (https://github.com/undp/carbon-footprint-program), and the demo site https://www.huellaslatam.org responds over HTTPS with a valid certificate (verified: HTTP 200, certificate chain validates). Note for accuracy: huellaslatam.org is a demonstration environment, not a production-grade deployment — it exists to show the platform, and its configuration should not be read as a production reference. There is no single canonical production instance: each adopting country provisions and operates its own. What the project guarantees across every topology is that TLS is enforced by the platform layer with minTlsVersion pinned to 1.2 in the Bicep templates (infra/modules/appService.bicep, storage.bicep, frontDoor.bicep), and that plain HTTP is rejected or redirected before a request reaches application code. See docs/security/hardening.md, "Deployment topology" and "Transport Security".



    Проект ОБЯЗАН иметь один или несколько механизмов для обсуждения (включая предлагаемые изменения и проблемы), которые доступны для поиска, позволяют ссылаться на сообщения и темы по URL, позволяют новым людям участвовать в некоторых обсуждениях и не требуют установки на стороне клиента проприетарного программного обеспечения. [discussion]
    Примерами приемлемых механизмов являются архивируемые списки рассылки, обсуждения в GitHub issues и pull requests, Bugzilla, Mantis и Trac. Асинхронные механизмы обсуждения (например, IRC) приемлемы, если они отвечают этим критериям; убедитесь, что есть механизм архивирования URL-адресов. Разрешено, хотя и не рекомендуется, использовать проприетарный JavaScript.

    GitHub supports discussions on issues and pull requests. The repository is public with GitHub Issues enabled (and issue templates), GitHub Discussions enabled, and pull-request review threads — all URL-addressable, searchable and archived.



    Проекту СЛЕДУЕТ предоставлять документацию на английском языке и иметь возможность принимать отчеты об ошибках и комментарии о коде на английском языке. [english]
    Английский в настоящее время является лингва франка компьютерной техники; Поддержка английского языка увеличивает число потенциальных разработчиков и рецензентов во всем мире. Проект может соответствовать этому критерию, даже если английский не является основным языком его ключевых разработчиков.

    All maintainer-facing material is in English: README.md, CONTRIBUTING.md, GOVERNANCE.md, SECURITY.md, SUPPORT.md, CODE_OF_CONDUCT.md, PRIVACY.md, the whole docs/ tree, issue and pull-request templates, and code comments. The end-user product UI is Spanish by design, since the platform targets Latin American government and organizational users.



    НЕОБХОДИМО, чтобы проект поддерживался. [maintained]
    Как минимум, проект должен пытаться реагировать на сообщения о серьезных проблемах и уязвимостях. Проект, который активно добивается получения значка, вероятно, и поддерживается тоже. Ресурсы любого проекта и человека ограничены, и обычно проекты будут отклонять некоторые предлагаемые изменения; поэтому ограниченность ресурсов и отклонение предложений сами по себе не указывают на то, что проект не поддерживается.

    Если известно, что проект больше не будет поддерживаться, следует установить для этого критерия значение «Не соответствует» и использовать подходящие механизмы, чтобы указать другим, что он не поддерживается. Например, используйте “DEPRECATED” («УСТАРЕЛ») в качестве первого заголовка в файле README, добавьте “DEPRECATED” в начале его домашней страницы, добавьте “DEPRECATED” в начало описания проекта репозитория кода, добавьте значок об отсутствии поддержки в README проекта и/или домашнюю страницу, пометьте его как устаревший в любых репозиториях пакетов (напр., npm deprecate ) и/или используйте механизм, предоставленный репозиторием кода для его архивирования (например, параметр "archive" у GitHub или пометка "archive" у GitLab, статус «только для чтения» у Gerrit или статус «брошенного» проекта у SourceForge). Дополнительное обсуждение можно найти здесь .

    The project is actively maintained. 519 commits on main, the most recent release 1.6.0 published 2026-07-27, and eleven releases (1.1.1 through 1.6.0) since 2026-05. Commits and merged pull requests land continuously (PR #550 merged the day of this assessment). Maintainer responsibilities and merge/release authority are defined in https://github.com/undp/carbon-footprint-program/blob/main/GOVERNANCE.md.


 Управление изменениями 9/9

  • Публичное хранилище исходного кода с поддержкой версий


    Проект ОБЯЗАН иметь репозиторий (хранилище) исходного кода с управлением версиями, который является общедоступным и имеет URL. [repo_public]
    URL МОЖЕТ быть таким же, как URL проекта. Проект МОЖЕТ использовать частные (непубличные) ветви в конкретных случаях, когда изменение не выпускается публично (например, для устранения уязвимости до того, как она будет открыта для публики).

    Repository on GitHub, which provides public git repositories with URLs: https://github.com/undp/carbon-footprint-program (visibility: public).



    Проектный репозиторий исходного кода ОБЯЗАН отслеживать, какие изменения были внесены, кто внес изменения и когда изменения были сделаны. [repo_track]

    Repository on GitHub, which uses git. git records the author, committer and timestamp of every change, together with the full parent history.



    Чтобы обеспечить возможность для проверки другими участниками, проектный репозиторий исходного кода ОБЯЗАН включать промежуточные версии для проверки между релизами; НЕДОПУСТИМО хранить в репозитории лишь финальные версии. [repo_interim]
    Проекты МОГУТ опускать отдельные промежуточные версии из своих публичных репозиториев (например, те, которые фиксируют отдельные не обнародованные уязвимости, никогда не будут публично выпущены или включают материалы, которые не могут быть опубликованы на законных основаниях и не находятся в финальной версии).

    Development happens in the open between releases: every change lands as a pull request merged to main, and those interim commits are public immediately rather than only at release time. 519 commits, 505 pull requests (425 of them merged) and 49 issues are publicly visible, and each release is cut from already-public main history rather than from a private branch.



    Для хранилища проектного исходного кода ЖЕЛАТЕЛЬНО использовать типовое ПО для распределенного управления версиями (например, git). [repo_distributed]
    Не требуется именно git, и проекты могут использовать централизованное программное обеспечение для управления версиями (например, Subversion) с обоснованием.

    Repository on GitHub, which uses git. git is a distributed version control system.


  • Уникальная нумерация версий


    Результаты проекта ОБЯЗАНЫ иметь уникальный идентификатор версии для каждой версии, предназначенной для конечных пользователей. [version_unique]
    Это МОЖНО выполнить различными способами, включая идентификаторы коммита (например, идентификатор коммита git или идентификатор набора изменений mercurial) или номер версии (включая номера версий, которые используют семантическое версионирование или схемы на основе даты, такие как YYYYMMDD).

    Every release has a unique identifier: an annotated git tag and a matching GitHub Release (1.1.1, 1.1.2, 1.2.0, 1.3.0, 1.3.1, 1.3.2, 1.4.0, 1.4.1, 1.4.2, 1.5.0, 1.6.0) — see https://github.com/undp/carbon-footprint-program/releases. The canonical version lives in the root package.json, is baked into the Docker image tag, and is exposed at runtime through the APP_VERSION value returned by the API health endpoint.



    Для выпусков ЖЕЛАТЕЛЬНО использовать семантическую либо календарную нумерацию версий. При использовании календарной нумерации к версии ЖЕЛАТЕЛЬНО добавлять микро-компоненту. [version_semver]
    МОЖНО использовать в качестве номеров версий другие схемы нумерации версий, такие как идентификаторы коммитов (например, идентификатор коммита в git или идентификатор набора изменений в mercurial) или схемы на основе даты, такие как YYYYMMDD, поскольку они уникальны. Некоторые альтернативы могут вызвать трудности, поскольку пользователи могут быть не в состоянии легко определить, используют ли они последнюю версию. SemVer может оказаться менее полезным для идентификации версий программного обеспечения, если все получатели используют только последнюю версию (например, это код для одного веб-сайта или интернет-сервиса, который постоянно обновляется с помощью непрерывной доставки).

    The project uses Semantic Versioning (MAJOR.MINOR.PATCH) and documents the increment rules at https://github.com/undp/carbon-footprint-program/blob/main/docs/release/versioning.md. The published tags follow SemVer (e.g. 1.4.1 → 1.4.2 for fixes, 1.5.0 → 1.6.0 for backward-compatible features).



    Проектам ЖЕЛАТЕЛЬНО идентифицировать каждый выпуск в своей системе управления версиями. Например, при использовании git ЖЕЛАТЕЛЬНО идентифицировать каждую версию, используя теги git. [version_tags]

    Each release is identified by a git tag with the exact version number, and the tag is what the GitHub Release points at: https://github.com/undp/carbon-footprint-program/tags.


  • Примечания к выпуску


    Проект ОБЯЗАН предоставлять с каждой выпускаемой версией замечания к выпуску - удобочитаемые человеком сведения об основных изменениях в этом выпуске, помогающие пользователям определить, должны ли они обновляться и какими будут последствия обновления. НЕДОПУСТИМО делать замечания к выпуску сырым выводом журнала управления версиями (например, результаты команды «git log» не являются замечаниями к выпуску). Проекты, результаты которых не предназначены для повторного использования в нескольких местах (например, программное обеспечение для одного веб-сайта или службы) И выдаются через непрерывную доставку (continuous delivery) МОГУТ выбрать «неприменимо» (N/A). (Требуется URL) [release_notes]
    Замечания к выпуску МОГУТ быть реализованы различными способами. Многие проекты предоставляют их в файле с именем «NEWS», «CHANGELOG» или «ChangeLog», возможно с расширениями, такими как «.txt», «.md» или «.html». Исторически термин «журнал изменений» означал журнал для каждого изменения, но для соответствия этим критериям требуется человекочитаемая сводка. Замечания к выпуску МОГУТ вместо этого быть предоставлены механизмами системы контроля версий, такими как процесс GitHub Releases.

    Every release publishes human-readable release notes as a GitHub Release: https://github.com/undp/carbon-footprint-program/releases. Each entry has a "What's Changed" summary grouped by area (e.g. "User Modules", infrastructure, dependencies) listing each merged change with its author and pull-request link — for example https://github.com/undp/carbon-footprint-program/releases/tag/1.6.0. Notes are provided for all eleven releases, 1.1.1 through 1.6.0.



    В замечаниях о выпуске НЕОБХОДИМО упоминать каждую общеизвестную уязвимость, исправленную ​​в каждой новой версии, для которой существует CVE или аналогичная публичная запись. Критерий может быть отмечен как неприменимый (N/A), если у пользователей обычно нет практической возможности обновить данное ПО самостоятельно (это часто относится к, например, обновлениям ядра операционной системы). Если замечаний о выпуске не публиковалось или не было обнародованных уязвимостей, отвечайте "неприменимо". [release_notes_vulns]
    Этот критерий помогает пользователям определить, исправит ли данное обновление общеизвестную уязвимость, чтобы помочь пользователям принять обоснованное решение об обновлении. Если пользователи обычно не могут практически самостоятельно обновлять программное обеспечение на своих компьютерах, а вместо этого должны полагаться на одного или нескольких посредников для выполнения обновления (как это часто бывает с ядром и низкоуровневым программным обеспечением, которое взаимосвязано с ядром), проект вместо этого можно выбрать «Неприменимо», поскольку эта дополнительная информация будет бесполезна для таких пользователей. Аналогично, проект может выбрать «неприменимо» (N/A), если все получатели используют только последнюю версию (например, это код для одного веб-сайта или интернет-службы, который постоянно обновлен при помощи непрерывной доставки). Этот критерий применим только к результатам проекта, а не к его зависимостям. Перечисление уязвимостей всех транзитивных зависимостей проекта становится громоздким, поскольку зависимости увеличиваются и изменяются; и в этом нет необходимости, поскольку инструменты, которые исследуют и отслеживают зависимости, могут делать это более масштабируемым способом.

    No publicly known, CVE-assigned vulnerability in this project's own code has been fixed in any release to date, so there is nothing of that kind to enumerate. Dependency vulnerabilities are handled by Dependabot security updates, and the resulting pull requests appear by name in the "What's Changed" list of the release that includes them (see https://github.com/undp/carbon-footprint-program/releases). Should a vulnerability in the project's own code ever be fixed, SECURITY.md commits the maintainers to coordinated disclosure and the release notes will call it out.


 Отчеты о проблемах 8/8

  • Процесс сообщения об ошибках


    Проект ОБЯЗАН предоставить пользователям возможность отправлять сообщения об ошибках (например, используя систему отслеживания ошибок или список рассылки). (Требуется URL) [report_process]

    The bug-reporting process is documented in three places: CONTRIBUTING.md "Reporting bugs & requesting features" https://github.com/undp/carbon-footprint-program/blob/main/CONTRIBUTING.md, .github/SUPPORT.md, which routes each kind of report to the right channel https://github.com/undp/carbon-footprint-program/blob/main/.github/SUPPORT.md, and structured issue forms at https://github.com/undp/carbon-footprint-program/issues/new/choose (bug report, feature request, refactor, DPG compliance). Security vulnerabilities are explicitly excluded from public issues and routed to the private process in https://github.com/undp/carbon-footprint-program/blob/main/SECURITY.md.



    СЛЕДУЕТ использовать трекер вопросов (issue tracker) для отслеживания отдельных вопросов. [report_tracker]

    GitHub Issues is used as the issue tracker: https://github.com/undp/carbon-footprint-program/issues. It is backed by structured issue forms in .github/ISSUE_TEMPLATE/ (bug_report.yml, feature_request.yml, refactor.yml, dpg_compliance.yml) and a namespaced label taxonomy maintained as code in .github/labels.yml (type:, area:, priority:, status:), so reports are consistently classified and triaged.



    Проект ОБЯЗАН подтверждать получение большинства сообщений об ошибках, отправленных за последние 2-12 месяцев (включительно); подтверждение не обязательно включает исправление. [report_responses]

    Bug reports are consistently acknowledged and acted on. Of the 49 issues filed in the last 12 months, 18 are already closed, and bugs are typically triaged within a day — for example issue #547 (equivalence computed in the wrong unit) was filed 2026-07-28 and fixed and closed 2026-07-29 by PR #550. Every incoming report is labelled (type:bug, area:, priority:, status:triage), which is the acknowledgement step, and priority:critical bugs such as #395 and #391 were closed with fixes. To date no report has been left unanswered.



    Проекту СЛЕДУЕТ реагировать на большинство (>50%) запросов на улучшения в течение последних 2-12 месяцев (включительно). [enhancement_responses]
    В качестве ответа МОЖЕТ быть «нет» или обсуждение выгод от данного улучшения. Цель состоит в том, чтобы по крайней мере на некоторые запросы был какой-то ответ, что указывает на то, что проект все еще жив. Для целей этого критерия не нужно учитывать поддельные запросы (например, от спамеров или автоматизированных систем). Если проект больше не принимает улучшения, выберите «не соответствует» и укажите URL, проясняющий ситуацию для пользователей. Если проект большую часть времени перегружен количеством запросов на улучшения, выберите «не cоответствует» и объясните.

    Enhancement requests are triaged the same way as bugs: they are labelled type:feature (or type:refactor / type:tech-debt), given an area and a priority, and either scheduled or answered in the thread. Several have been implemented and shipped — for example the "optional comment on approving a submission" request (PR #409, released in 1.6.0) and the provider-agnostic backend auth refactor (#398, closed 2026-07-09). Requests that conflict with the project's country-agnosticism principle are answered with that rationale, as documented in .github/SUPPORT.md.



    Проект ОБЯЗАН иметь общедоступный архив для отчетов и ответов для последующего поиска. (Требуется URL) [report_archive]

    The issue tracker is public, searchable and permanently archived at https://github.com/undp/carbon-footprint-program/issues?q=is%3Aissue, covering both open and closed issues. Pull-request discussions are similarly public at https://github.com/undp/carbon-footprint-program/pulls?q=is%3Apr, and GitHub Discussions is enabled for longer-form threads.


  • Процесс отчета об уязвимостях


    Проект ОБЯЗАН публиковать процесс уведомления об уязвимостях на сайте проекта. (Требуется URL) [vulnerability_report_process]
    Например, четко обозначенный почтовый адрес на https://PROJECTSITE/security, часто в форме security@example.org. Процесс МОЖЕТ быть таким же, как и процесс для отчетов об ошибках. Отчеты об уязвимостях МОГУТ быть всегда общедоступными, но многие проекты имеют приватный механизм для отправки отчетов об уязвимостях.

    The vulnerability reporting process is published in https://github.com/undp/carbon-footprint-program/blob/main/SECURITY.md. The declared security contact is the maintainer team collectively — the @undp/carbon-footprint-program-maintainers GitHub team (see https://github.com/undp/carbon-footprint-program/blob/main/.github/CODEOWNERS and https://github.com/undp/carbon-footprint-program/blob/main/GOVERNANCE.md) — so handling a report never depends on one individual's availability. SECURITY.md states that vulnerabilities must not be reported through public issues, discussions or pull requests, names GitHub private vulnerability reporting as the private channel, tells a reporter who cannot use it to open a detail-free issue requesting a private channel, and gives an escalation path to the maintainer team after 5 business days. It also lists what to include in a report and the in-scope and out-of-scope components.



    Если поддерживаются приватные отчеты об уязвимости, проект ОБЯЗАН включить описание того, как отправлять сведения конфиденциальным способом. (Требуется URL) [vulnerability_report_private]
    Примеры включают приватный отчет о дефектах, отправленный в Интернете с использованием HTTPS (TLS) или электронной почты, зашифрованной с использованием OpenPGP. Если отчеты об уязвимостях всегда являются общедоступными (поэтому нет приватных отчетов об уязвимостях), выберите «неприменимо» (N/A).

    Private reporting is available through GitHub Private Vulnerability Reporting, which is enabled on the repository and reachable from the Security tab at https://github.com/undp/carbon-footprint-program/security/advisories. It is documented as the preferred channel in https://github.com/undp/carbon-footprint-program/blob/main/SECURITY.md. Reports go privately to the maintainer team collectively (@undp/carbon-footprint-program-maintainers) rather than to a named individual, which keeps the report, the discussion, the fix and any resulting advisory in one private place with no single point of failure. SECURITY.md explicitly asks reporters not to use public issues, discussions or pull requests, and offers a detail-free public issue as a way to request a private channel for anyone who cannot use GitHub PVR.



    Проект ОБЯЗАН обеспечивать время первоначального отклика на любой отчет об уязвимости, полученный за последние 6 месяцев, в пределах 14 дней или меньше. [vulnerability_report_response]
    Если за последние 6 месяцев не было обнаружено никаких уязвимостей, выберите «неприменимо» (N/A).

    https://github.com/undp/carbon-footprint-program/blob/main/SECURITY.md publishes the maintainer team's commitment to acknowledge a vulnerability report within 3 business days — well inside the 14-day requirement — and tells reporters to escalate to the maintainer team if they have not heard back within 5 business days. It further commits to validating the issue, agreeing a remediation timeline with the reporter, and practising coordinated disclosure with credit unless the reporter prefers anonymity. In the interest of accuracy: this is the maintainer team's published working target, and formal ratification of the acknowledgement and remediation SLAs by UNDP as the owning organization is still in progress (tracked in issue #460).


 Качество 13/13

  • Рабочая система сборки


    Если программное обеспечение, создаваемое проектом, требует сборки для использования, проект ОБЯЗАН предоставить рабочую систему сборки, которая может автоматически пересобирать программное обеспечение из исходного кода. [build]
    Система сборки определяет, какие действия необходимо предпринять для пересборки программного обеспечения (и в каком порядке), а затем выполняет эти действия. Например, она может вызывать компилятор для компиляции исходного кода. Если исполняемый файл создается из исходного кода, должна иметься возможность изменить исходный код проекта, а затем сгенерировать обновленный исполняемый файл с этими изменениями. Если программное обеспечение, создаваемое проектом, зависит от внешних библиотек, система сборки не обязана пересобирать эти внешние библиотеки. Если для использования программного обеспечения после изменения его исходного кода пересборка не требуется, выберите «неприменимо» (N/A).

    The software is built from source with two standard commands: "pnpm install" then "pnpm build". The root package.json "build" script drives Turborepo, which builds the shared packages (@repo/types, constants, utils, database, storage), the Fastify API and the React/Vite web app in dependency order. Prerequisites and exact toolchain versions are pinned in .tool-versions and .nvmrc and documented in https://github.com/undp/carbon-footprint-program/blob/main/docs/development/local-setup.md. CI proves the build works from a clean checkout on every pull request via the required "Build" job in .github/workflows/ci.yml.



    ЖЕЛАТЕЛЬНО использовать общеупотребительные инструменты для сборки программного обеспечения. [build_common_tools]
    Например, Maven, Ant, cmake, autotools, make, rake или devtools (R).

    The build uses widely available, conventional tooling: Node.js, pnpm (workspaces), Turborepo, the TypeScript compiler (tsc), Vite for the web bundle, Prisma for schema/client generation, and Docker for containerization. There are no bespoke build tools to learn.



    Для сборки проекта СЛЕДУЕТ использовать только инструменты со свободными лицензиями. [build_floss_tools]

    Every tool required to build the project is FLOSS: Node.js, pnpm, Turborepo, TypeScript, Vite, Prisma, ESLint, Prettier, Vitest and Docker. The project can be built and tested end to end on a FLOSS platform with no proprietary software; a docker-compose setup provides Postgres, Keycloak and MinIO as open-source local dependencies.


  • Набор автотестов


    Проект ОБЯЗАН использовать по крайней мере один автоматизированный набор тестов, опубликованный как свободное ПО (этот набор тестов может поддерживаться как отдельный проект свободного ПО). Проект ОБЯЗАН ясно показывать или иметь документацию о том, как запускать наборы тестов (например, через непрерывную интеграцию (CI) или используя файлы документации, такие как BUILD.md, README.md или CONTRIBUTING.md). [test]
    Проект МОЖЕТ использовать несколько автоматизированных наборов тестов (например, один, который работает быстро, а другой - более тщательный, но требует специального оборудования). Существует множество каркасов (frameworks) и систем поддержки тестирования, включая Selenium (автоматизация веб-браузера), Junit (JVM, Java), RUnit (R), testthat (R).

    The project has an automated test suite documented at https://github.com/undp/carbon-footprint-program/blob/main/docs/development/testing.md. apps/api has 199 test files, of which 161 are integration tests that exercise real HTTP routes through Fastify's app.inject() against a real PostgreSQL instance provisioned with Testcontainers (plus Azurite and MinIO for the storage legs). apps/web adds 37 Vitest suites running under jsdom with React Testing Library. tools/seed has its own unit suite. The whole suite runs in CI on every pull request.



    Запуск набора тестов СЛЕДУЕТ реализовывать стандартным способом для этого языка. [test_invocation]
    Например, «make check», «mvn test» или «rake test» (Ruby).

    The suite runs with the standard single command "pnpm test" from the repository root (Turborepo fans it out to every workspace). Narrower entry points exist for convenience: "pnpm test:api", "pnpm test:web", "pnpm test:seed", and "pnpm test:api -- /<feature>" for a single feature.



    ЖЕЛАТЕЛЬНО охватывать набором тестов большинство (а в идеале все) ветви кода, поля ввода и функциональные возможности. [test_most]

    The test suite covers most of the code and most of the functionality. apps/api — which holds essentially all of the business logic, including emission calculations, authorization, and the data layer — is gated in CI at 90% coverage for lines, statements, functions and branches, merged across the three test legs by the required "Coverage" job in .github/workflows/ci.yml. That gate is enforced on every pull request, so the figure is a floor rather than a snapshot, and every externally reachable endpoint has an integration test (161 integration test files exercising real HTTP routes against a real PostgreSQL instance via Testcontainers). Stated transparently: apps/web is covered by a smaller Vitest + jsdom + React Testing Library suite (37 files) over its logic layers — utils, hooks, stores, chatbot — behind an enforced floor that is deliberately ratcheted upward as tests are added, so a share of its render-heavy UI is not yet covered. The judgement recorded here is that a 90%-gated backend plus a growing frontend suite satisfies "most".



    ЖЕЛАТЕЛЬНО реализовать непрерывную интеграцию (Continuous Integration - частая интеграция нового или измененного кода в центральное хранилище кода, и запуск автоматических тестов на получившейся базе кода). [test_continuous_integration]

    Continuous integration runs the full suite on every pull request to main via .github/workflows/ci.yml. "Test (base)", "Test (storage-azure)", "Test (storage-minio)", "Test (web)", "Seed Unit Tests" and "Coverage" are required status checks under branch protection, alongside Lint, Type Check, Format Check, Build, Audit, Zizmor, Secret Scan and Docs Link Check. See https://github.com/undp/carbon-footprint-program/actions/workflows/ci.yml.


  • Тестирование новых функций


    Проект ОБЯЗАН иметь общую политику (формальную или нет), обязывающую добавлять тесты в набор автоматических тестов по мере добавления новых функциональных возможностей к программному обеспечению, создаваемому проектом. [test_policy]
    Если есть действующая политика, хотя бы «из уст в уста», которая говорит, что разработчики должны добавлять тесты в набор автотестов для новой функциональности, указывайте «соответствует».

    The policy is written down in CONTRIBUTING.md under "Contribution acceptance criteria": "Test coverage — new features include integration tests" https://github.com/undp/carbon-footprint-program/blob/main/CONTRIBUTING.md#contribution-acceptance-criteria. docs/development/testing.md gives the concrete conventions for writing them, and the policy is mechanically enforced by the 90% merged-coverage gate in CI, which fails a pull request that adds logic without adding tests.



    Проект ОБЯЗАН иметь доказательства того, что критерий test_policy о добавлении тестов соблюдался при недавних крупных изменениях ПО, создаваемого проектом. [tests_are_added]
    Крупная функциональность обычно упоминается в замечаниях к выпуску. Совершенство не требуется, просто доказательство того, что на практике тесты обычно добавляются в набор автотестов, когда к ПО, создаваемому проектом, добавляются новые крупные функции.

    Tests accompany functional changes as a matter of course — apps/api currently carries 199 test files across 161 integration suites, grown alongside the features they cover, and apps/web has 37. The requirement is enforced rather than merely encouraged: the required "Coverage" check re-computes merged coverage across all three test legs and fails below 90% on lines, statements, functions and branches, so a feature pull request without matching tests cannot merge. Recent examples of test-only ratchets are PRs #509, #515 and #518.



    ЖЕЛАТЕЛЬНО задокументировать эту политику добавления тестов (см. критерий test_policy) в инструкции к предложениям об изменениях. [tests_documented_added]
    Однако даже неформальное правило приемлемо, если тесты добавляются на практике.

    The policy is documented in two places: the "Contribution acceptance criteria" section of https://github.com/undp/carbon-footprint-program/blob/main/CONTRIBUTING.md, and the testing guide at https://github.com/undp/carbon-footprint-program/blob/main/docs/development/testing.md, which explains the Vitest + Testcontainers setup, the app.inject() pattern, and the factory helpers a contributor should use when adding tests.


  • Флаги предупреждений


    Проект ОБЯЗАН включать один или несколько предупреждающих флагов компилятора, «безопасный» языковой режим или использовать отдельный инструмент «linter» для поиска ошибок качества кода или типовых простых ошибок, если есть хотя бы один инструмент на свободном ПО, который может реализовать этот критерий на выбранном языке. [warnings]
    Примером предупреждающего флага компилятора может служить "-Wall" для gcc/clang. Примеры «безопасного» языкового режима включают «use strict» в JavaScript и «use warnings» в perl5. Отдельный инструмент «linter» - это просто инструмент, который исследует исходный код для поиска ошибок качества кода или типовых простых ошибок. Всё это обычно включается в исходный код или инструкции сборки.

    Compiler and linter warnings are enabled at a strict level. TypeScript runs with "strict": true (packages/typescript-config/base.json), and ESLint uses typescript-eslint's recommendedTypeChecked configuration (packages/eslint-config/base.ts), which requires full type information and therefore reports type-aware problems, not just syntactic ones. Both run over the whole monorepo via "pnpm lint" and "pnpm type-check".



    Проект ОБЯЗАН обращать внимание на предупреждения. [warnings_fixed]
    Речь о предупреждениях, найденных при выполнении критерия warnings. Проект должен исправлять предупреждения или отмечать их в исходном коде как ложные срабатывания. В идеале не должно быть никаких предупреждений, но проект МОЖЕТ принимать существование каких-то предупреждений (обычно менее 1 предупреждения на 100 строк или менее 10 предупреждений).

    There are no outstanding warnings, and the build enforces that: "pnpm lint" is invoked as "turbo run lint -- --max-warnings=0", so a single ESLint warning fails the required "Lint" status check, and "pnpm type-check" fails the required "Type Check" check on any TypeScript error. Both are required checks under branch protection, so warnings cannot accumulate on main.



    ЖЕЛАТЕЛЬНО, чтобы проекты использовали самый строгий режим предупреждений в производимом ПО, где это целесообразно. [warnings_strict]
    Некоторые предупреждения не могут быть эффективно задействованы в некоторых проектах. Что необходимо в этом критерии - это доказательства того, что проект стремится включать флаги предупреждений там, где это возможно, чтобы ошибки обнаруживались на ранней стадии.

    Maximally strict settings are enabled rather than the defaults: TypeScript "strict": true, and typescript-eslint's recommendedTypeChecked ruleset, which needs a full type-checked program and catches classes of bug (unsafe any flow, floating promises, unnecessary conditionals) that non-type-aware linting cannot see. Prettier formatting is separately enforced by a required "Format Check" job.


 Безопасность 16/16

  • Знание безопасной разработки


    По крайней мере один основной разработчик на проекте ОБЯЗАН знать, как проектировать безопасное программное обеспечение (точные требования описаны в подробностях к критерию). [know_secure_design]
    Это требует понимания следующих принципов проектирования, в том числе 8 принципов из Saltzer and Schroeder:
    • экономичность механизма (поддерживать дизайн ПО настолько простым и компактным, насколько практически возможно, например, с помощью массовых упрощений)
    • отказобезопасные значения по умолчанию (доступ по умолчанию должен быть запрещен, а установка проектов по умолчанию должна быть в защищенной конфигурации)
    • полное разграничение (любой доступ, который может быть ограничен, должен проверяться на достаточность прав доступа и не иметь обходных путей)
    • открытый дизайн (механизмы безопасности должны полагаться не на незнание их злоумышленником, а на данные типа ключей и паролей, которые проще защищать и менять)
    • разделение привилегий (в идеале доступ к важным объектам должен зависеть от более чем одного условия, так чтобы взлом одной системы защиты не приводил к полному доступу; напр., многофакторная аутентификация с требованием и пароля, и аппаратного токена сильнее однофакторной)
    • минимальные привилегии (процессы должны работать с минимальными привилегиями, необходимыми для выполнения ими своих функций)
    • наименьший общий механизм (дизайн должен минимизировать механизмы, общие для нескольких пользователей и следовательно зависящие от всех этих пользователей, например, каталоги для временных файлов)
    • психологическая приемлемость (интерфейс для человека должен быть спроектирован с учетом удобства использования - может быть полезным проектирование для «наименьшего удивления»)
    • ограничение периметра атаки (периметр атаки - множество разных точек, в которых злоумышленник может попытаться ввести или извлечь данные - должен быть ограничен)
    • проверка входных данных с помощью списков на допуск (входы обычно должны проверяться на корректность до их принятия; эта проверка должна использовать списки на допуск, содержащие только заведомо хорошие значения, а не списки на запрет, пытающиеся перечислить заведомо плохие значения).
    «Основной разработчик» в проекте - это любой, кто знаком с базой кода проекта, без затруднений может вносить в него изменения и признан таковым большинством других участников проекта. Основной разработчик, как правило, неоднократно вносит вклад в течение последнего года (через код, документацию или ответы на вопросы). Разработчики обычно считаются основными разработчиками, если это они начали проект (и не покинули проект более трех лет назад), имеют возможность получать информацию по закрытому каналу для отчетов об уязвимостях (если он есть), могут принимать коммиты от имени проекта или делать финальные выпуски программного обеспечения проекта. Если есть только один разработчик, этот человек является основным разработчиком. Есть много книг и курсов, помогающих понять, как разрабатывать более безопасное ПО, с обсуждением вопросов проектирования. Например, Secure Software Development Fundamentals - это бесплатный набор из трех курсов, объясняющих, как разрабатывать более безопасное ПО (бесплатный для обучения; за отдельную плату вы можете получить сертификат для подтверждения, что вы освоили материал).

    The maintainer team collectively (@undp/carbon-footprint-program-maintainers — see https://github.com/undp/carbon-footprint-program/blob/main/.github/CODEOWNERS and https://github.com/undp/carbon-footprint-program/blob/main/GOVERNANCE.md) holds and applies the knowledge of how to design secure software; this is asserted for the team rather than for one individual, matching how the project is actually governed and reviewed. The design record is public under docs/security/ https://github.com/undp/carbon-footprint-program/tree/main/docs/security: authentication.md (OIDC/JWKS token verification), rbac.md and route-access-modes.md (role-based authorization applied per route), hardening.md (deployment topologies, TLS enforcement, HTTP security headers, input validation, upload controls), secrets.md (Azure Key Vault with managed identities, no credentials in code), sensitive-data.md, audit-logging.md, and github-actions-security.md. The principles are visible in the code, not just the docs: least privilege via per-route role guards; fail-closed defaults — the API refuses to boot in production unless JWKS_URI, JWKS_ISSUER and JWKS_AUDIENCE are set, rather than silently accepting tokens it cannot bind to this application (apps/api/src/config/environment.ts); defense in depth (helmet headers, then schema validation, then authorization, then audit logging); minimal attack surface; and no trust in client-supplied identity. CONTRIBUTING.md requires an explicit maintainer security review for any change to auth, authorization, file upload or database queries, which is how the knowledge is applied structurally rather than incidentally. Complementary documents are SECURITY.md and PRIVACY.md.



    По крайней мере, один из основных разработчиков проекта ОБЯЗАН знать об общих видах ошибок, которые приводят к уязвимостям в этом виде программного обеспечения, а также по крайней мере одному методу противодействия или смягчения каждого из них. [know_common_errors]
    Примеры (в зависимости от типа ПО) включают внедрение SQL-кода (injection), внедрение на уровне ОС, классическое переполнение буфера, межсайтовый скриптинг, отсутствие проверки подлинности и отсутствие авторизации. Обычно используемые списки уязвимостей можно найти в CWE/SANS top 25 или OWASP Top 10. Есть много книг и обучающих курсов, помогающих понять, как разрабатывается безопасное программное обеспечение, и обсуждающих типичные ошибки в реализации, ведущие к уязвимостям. К примеру, Secure Software Development Fundamentals - это набор из трех курсов, объясняющих, как сделать разрабатываемое ПО более безопасным (бесплатный для прослушивания; за дополнительную плату вы можете получить справку о том, что прошли его).

    The maintainer team collectively (@undp/carbon-footprint-program-maintainers) holds this knowledge, and the codebase reflects it. Injection: all database access goes through Prisma's parameterized query builder; there is no string-concatenated SQL. Input validation: every request body, query and parameter is validated against a Zod schema at the route boundary (schemas live in packages/types), so unvalidated input never reaches business logic. Broken access control: authorization is enforced server-side by explicit requireAuth / requireRoles / requireOrganizationRole hooks per route, documented in docs/security/rbac.md and route-access-modes.md and covered by integration tests. XSS and header attacks: @fastify/helmet applies secure headers globally and React escapes by default. Insecure direct object references: domain access hooks verify organization membership before returning records. Secrets in code: Azure Key Vault with managed identities, plus GitHub secret scanning with push protection and a betterleaks CI gate over full git history. Race conditions and partial writes: multi-step mutations run inside Prisma transactions. These classes are also checked mechanically by CodeQL's security-and-quality suite on every push and pull request. The team also files its own hardening findings publicly rather than leaving them implicit — see issue #559, which pins an explicit JWT algorithms allowlist to close an algorithm-confusion surface found while preparing this badge.


  • Основы правильного использования криптографии

    Обратите внимание, что некоторое ПО не нуждается в использовании криптографических механизмов.

    Программное обеспечение, созданное проектом, ОБЯЗАНО использовать по умолчанию только публикуемые криптографические протоколы и алгоритмы, которые анализируются экспертами (если используются криптографические протоколы и алгоритмы). [crypto_published]
    Эти криптографические критерии не всегда применяются, поскольку некоторые программы не нуждаются в прямом использовании криптографических возможностей.

    The project uses only standard, published cryptographic protocols and algorithms: TLS 1.2+ for all transport, RSA/ECDSA signature verification of OIDC JWTs via JWKS (@fastify/jwt with jwks-rsa), SHA-2 family digests, and AES-256 for encryption at rest in Azure Storage. No proprietary or homegrown cryptography is used or implemented.



    Если программное обеспечение, создаваемое проектом, является приложением или библиотекой, и его основной целью является не внедрение криптографии, тогда для реализации криптографических функций СЛЕДУЕТ обращаться к программному обеспечению, специально предназначенному для этого; НЕ СЛЕДУЕТ повторно реализовывать свои собственные функции. [crypto_call]

    The project does not implement cryptography itself; it calls established, well-reviewed implementations: Node.js node:crypto (OpenSSL) for random values, @fastify/jwt and jwks-rsa for JWT signature verification and key retrieval, and the platform TLS stacks of Azure Front Door, App Service and Static Web Apps for transport. Password handling is delegated entirely to the external OIDC identity provider.



    Вся функциональность программного обеспечения, создаваемого проектом, которая зависит от криптографии, ОБЯЗАНА быть реализована с использованием свободного ПО. [crypto_floss]

    All cryptographic functionality relies on FLOSS implementations: Node.js and its bundled OpenSSL, @fastify/jwt (MIT), jwks-rsa (MIT), and — in the fully open local/self-hosted configuration — Keycloak as the OIDC provider and MinIO for object storage. No proprietary crypto implementation is required to run the software.



    Механизмы безопасности в программном обеспечении, создаваемом проектом, ОБЯЗАНЫ использовать стандартные длины криптографических ключей, которые, по крайней мере, соответствуют минимальным требованиям NIST до 2030 года (как указано в 2012 году). Проект ОБЯЗАН предоставлять возможность настройки ПО таким образом, чтобы уменьшенные длины ключей были полностью отключены. [crypto_keylength]
    Эти минимальные длины в битах перечислены далее: симметричный ключ - 112, модуль факторизации - 2048, дискретный логарифмический ключ - 224, дискретная логарифмическая группа - 2048, эллиптическая кривая - 224 и хеш - 224 (хеширование пароля не покрывается этой длиной, больше информации о хешировании пароля можно найти в описании критерия crypto_password_storage). См. http://www.keylength.com для сравнения рекомендаций по длинам криптографических ключей от различных организаций. Программное обеспечение МОЖЕТ допускать меньшие длины ключей в некоторых конфигурациях (в идеале не должно, поскольку это позволяет атаки через понижение длины ключа, но иногда требуется более короткая длина ключа для обеспечения взаимодействия с другими системами).

    All default key lengths meet or exceed the NIST minimums, and the application never generates its own long-term asymmetric keys — every key it relies on is issued by a platform service or the identity provider. TLS certificates are issued and managed by the Azure services that terminate TLS (Static Web Apps for the frontend and App Service for the API; Azure Front Door additionally where an adopting country chooses to deploy it), using 2048-bit RSA or ECDSA P-256 keys; minTlsVersion is pinned to 1.2 in the Bicep templates, so only suites with 128-bit-or-better symmetric keys are negotiated. OIDC token-signing keys are fetched from the provider's JWKS endpoint: the demo environment uses Microsoft Entra ID, which signs with RSA-2048, and Keycloak — the open-source option documented for self-hosting — also defaults to RSA-2048. Encryption at rest in Azure Storage is AES-256. Symmetric secrets the project does control (cookie signing) are supplied from Azure Key Vault, never from a checked-in default.



    Механизмы безопасности по умолчанию в программном обеспечении, создаваемом проектом, НЕДОПУСТИМО делать зависимыми от взломанных криптографических алгоритмов (например, MD4, MD5, single DES, RC4, Dual_EC_DRBG) или использовать режимы шифрования, которые не подходят для контекста, если только они не требуются для интероперабельности протокола (поддерживающего самую новую версию стандарта на этот протокол, широко распространенного в сетевой экосистеме, причем эта экосистема требует использования данного алгоритма или режима, не предлагая более безопасных альтернатив). В документации НЕОБХОДИМО описать все связанные с этим риски безопасности и все известные способы смягчения рисков, если данные алгоритмы или режимы действительно нужны для совместимости с другими реализациями этого протокола. [crypto_working]
    Режим ECB почти никогда не подходит, потому что внутри зашифрованного ECB текста обнаруживаются идентичные блоки, как можно видеть на примере «пингвина ECB», а режим CTR часто неприемлем, поскольку не выполняет аутентификацию и приводит к дубликатам, контекста, если состояние ввода повторяется. Во многих случаях лучше всего выбирать режим алгоритма с блочным шифром, предназначенный для сочетания секретности и аутентификации, например, Galois / Counter Mode (GCM) и EAX. Проекты МОГУТ разрешать пользователям включать сломанные механизмы, где это необходимо для совместимости, но в таких случаях пользователи знают, что они это делают.

    The default configuration uses no broken or known-weak cryptographic algorithm or mode. TLS is pinned to a 1.2 minimum at every tier (infra/modules/appService.bicep, storage.bicep, frontDoor.bicep), excluding SSLv3, TLS 1.0 and 1.1 and their weak suites. MD5, SHA-1, DES, 3DES, RC4 and ECB mode are not used anywhere in the codebase; digests are SHA-2 family. Token signatures are verified against asymmetric public keys fetched from the identity provider's JWKS endpoint, and in production the API refuses to boot unless JWKS_URI, JWKS_ISSUER and JWKS_AUDIENCE are all set, so a token whose issuer or audience does not bind to this application is rejected (apps/api/src/config/environment.ts). Stated precisely rather than generously: the verify options pin issuer and audience but do not yet pin an explicit "algorithms" allowlist, so the accepted signature-algorithm set is currently inherited from the JWT library's key-type inference rather than asserted by the project. No broken algorithm is reachable, but that guarantee should be ours and not a dependency default — it is tracked publicly as a hardening item in issue #559 https://github.com/undp/carbon-footprint-program/issues/559.



    Механизмы безопасности по умолчанию в программном обеспечении, создаваемом проектом, НЕ СЛЕДУЕТ делать зависимыми от криптографических алгоритмов или режимов с известными серьезными слабостями (например, криптографический алгоритм хеширования SHA-1 или режим CBC в SSH). [crypto_weaknesses]
    Проблемы, связанные с режимом CBC в SSH, обсуждаются в описании уязвимости CERT: SSH CBC.

    The default configuration does not depend on cryptographically broken primitives. MD5, SHA-1, DES, 3DES and RC4 are not used for any security purpose; digests are SHA-2 family, and TLS 1.2+ enforcement excludes SHA-1-signed handshake suites. Container base images and dependencies are pinned by SHA-256 digest, and pnpm verifies package integrity with SHA-512 hashes.



    В механизмах безопасности в программном обеспечении, создаваемом проектом, СЛЕДУЕТ реализовать совершенную прямую секретность для протоколов соглашений о ключах, чтобы ключ сеанса, произведенный из набора долгосрочных ключей, не мог быть скомпрометирован, если один из долгосрочных ключей скомпрометирован в будущем. [crypto_pfs]

    Forward secrecy is provided by the Azure platform services that terminate TLS; the application implements no TLS itself and ships no certificate or cipher-suite configuration. In the default topology TLS terminates at Azure Static Web Apps (frontend) and Azure App Service (API, which faces the public internet directly in the demo environment); an adopting country may additionally place Azure Front Door in front, which is optional per deployment rather than required by the platform. All of these negotiate TLS 1.2+ with ECDHE (ephemeral Diffie-Hellman) key exchange, which gives perfect forward secrecy, and the Bicep templates pin minTlsVersion to 1.2 so no non-PFS legacy suite can be selected. Because Front Door is optional, this property does not depend on it — it holds in every supported topology. See docs/security/hardening.md, "Deployment topology" and "Transport Security".



    Если ПО, создаваемое проектом, требует хранить пароли для аутентификации внешних пользователей, НЕОБХОДИМО хранить пароли как итерированные хеши с солью для каждого пользователя с использованием алгоритма (итерированного) растяжения ключа (например, PBKDF2, Bcrypt или Scrypt). См. также: OWASP Password Storage Cheat Sheet (на англ.). [crypto_password_storage]
    Этот критерий применяется только тогда, когда программное обеспечение требует проверки внешних пользователей с использованием паролей (так называемая входящая аутентификация), таких как серверные веб-приложения. Он не применяется в тех случаях, когда программное обеспечение хранит пароли для аутентификации в других системах (исходящая аутентификация; например, программное обеспечение реализует клиент для какой-либо другой системы), поскольку по крайней мере части этого программного обеспечения должны часто обращаться к нехешированному паролю.

    The project does not store passwords for authentication of external users, so there is nothing to hash or salt. Authentication is delegated entirely to an external OpenID Connect identity provider (Microsoft Entra ID in the reference deployment, Keycloak in the open-source/local configuration). The API only verifies signed JWTs against the provider JWKS and never sees, transmits or persists a user credential; there is no local password table, reset flow, or credential column in the Prisma schema. See docs/security/authentication.md.



    Механизмы безопасности в программном обеспечении, создаваемом проектом, ОБЯЗАНЫ генерировать все криптографические ключи и временные значения с использованием криптографически безопасного генератора случайных чисел; НЕДОПУСТИМО делать это с использованием генераторов, которые криптографически небезопасны. [crypto_random]
    Криптографически безопасный генератор случайных чисел может быть аппаратным генератором случайных чисел или криптографически безопасным генератором псевдослучайных чисел (CSPRNG), использующим такие алгоритмы как Hash_DRBG, HMAC_DRBG, CTR_DRBG, Yarrow или Fortuna. Примеры вызовов защищенных генераторов случайных чисел включают java.security.SecureRandom в Java и window.crypto.getRandomValues в JavaScript. Примеры вызовов небезопасных генераторов случайных чисел включают java.util.Random в Java и Math.random в JavaScript.

    All security-relevant random values come from a cryptographically secure PRNG: the project uses randomUUID() from Node.js node:crypto (backed by OpenSSL) for request identifiers (apps/api/src/app.ts), chatbot session identifiers, and the opaque UUIDs that name uploaded objects in storage (apps/api/src/features/files/requestUpload/service.ts and the carbon-inventory line-file equivalent). Math.random() is not used for any security purpose. Session and token generation itself is handled by the external OIDC provider.


  • Доставка, защищенная от атак посредника (MITM)


    Проект ОБЯЗАН использовать механизм доставки, устойчивый против атак посредника (MITM). Приемлемо использование https или ssh + scp. [delivery_mitm]
    Еще более сильным механизмом является выпуск программного обеспечения в виде пакетов, подписанных цифровой подписью, поскольку это смягчает атаки на систему распространения, но это работает только в том случае, если пользователи могут быть уверены, что открытые ключи для подписей верны и если пользователи действительно проверяют подпись.

    Distribution channels use HTTPS exclusively. Source is distributed by GitHub over HTTPS or SSH, so the transport is authenticated and integrity-protected. Dependencies are installed from the registry over HTTPS with "pnpm install --frozen-lockfile", and pnpm-lock.yaml records an integrity hash for every package. Container base images are pinned by SHA-256 digest, and all GitHub Actions are pinned to full commit SHAs rather than mutable tags, so the CI supply chain cannot be silently redirected.



    НЕДОПУСТИМО получать криптографические контрольные суммы (например, sha1sum) по HTTP и использовать их без проверки криптографической подписи. [delivery_unsigned]
    Эти хеши могут быть изменены при передаче.

    No cryptographic hash or signature is retrieved over an unprotected channel. Package integrity hashes are committed in pnpm-lock.yaml inside the repository itself and fetched from the registry only over HTTPS; container base-image digests are committed in the Dockerfiles; GitHub Action versions are committed as full commit SHAs. Nothing in the build downloads a checksum over plain HTTP or from an untrusted mirror.


  • Исправление обнародованных уязвимостей


    НЕДОПУСТИМО оставлять незакрытыми уязвимости со степенью серьезности средней или выше, опубликованные более 60 дней назад. [vulnerabilities_fixed_60_days]
    Уязвимость должна быть исправлена ​​и выпущена самим проектом (патчи могут быть разработаны в другом месте). Уязвимость считается опубликованной (для цели данного критерия) после того, как она имеет CVE с описанием, бесплатно доступным для общественности, (например, в National Vulnerability Database) или когда проект был проинформирован, и информация была опубликована для общественности (возможно, самим проектом). Уязвимость имеет среднюю и высокую степень серьезности, если ее базовая оценка по CVSS 2.0 равна 4 или выше. Примечание. Это означает, что пользователи могут оставаться уязвимыми для всех злоумышленников по всему миру на срок до 60 дней. Этот критерий часто намного легче выполнить, чем рекомендует Google в Rebooting responsible disclosure, поскольку Google рекомендует, чтобы 60-дневный период начинался, когда проект был уведомлен, даже если отчет не является общедоступным.

    Known dependency vulnerabilities are surfaced and fixed continuously rather than on a 60-day clock. "pnpm audit --prod --audit-level moderate" runs as the required "Audit" status check on every pull request, so a moderate-or-higher advisory in the production dependency graph blocks merges until it is resolved. Dependabot security updates and alerts are enabled, with weekly version updates across the npm, docker and github-actions ecosystems (.github/dependabot.yml). A Trivy workflow scans dependencies and container images on pushes to main and on pull requests, and CodeQL runs on every push, pull request and weekly. Deliberate, time-boxed deferrals are tracked publicly in a periodic-review issue with an explicit re-check condition for each.



    Проектам СЛЕДУЕТ оперативно исправлять критические уязвимости после сообщения о них. [vulnerabilities_critical_fixed]

    Critical vulnerabilities are addressed promptly because the gates are blocking rather than advisory: the required "Audit" check fails the pull request on any moderate-or-higher advisory in the production dependency graph, so a critical one cannot reach main. Dependabot security updates open fix pull requests automatically, Trivy scans images and dependencies on push and pull request, and CodeQL findings land in GitHub code scanning for triage. Security-relevant issues are additionally labelled type:security and priority:critical in the tracker so they are visible and prioritized.


  • Другие вопросы безопасности


    НЕДОПУСТИМА утечка действующих частных учетных данных (например, рабочий пароль или закрытый ключ), предназначенных для ограничения общего доступа, из публичных репозиториев. [no_leaked_credentials]
    Проект МОЖЕТ пропускать «шаблонные» учетные данные для тестирования и несущественные базы данных, при условии что они не предназначены для ограничения общего доступа.

    No valid credential intended to limit public access is present in the repository, and three independent controls enforce that: GitHub secret scanning with push protection is enabled; a betterleaks job (the maintained gitleaks successor) runs on every pull request with fetch-depth 0, scanning the entire git history against .gitleaks.toml, and reports zero findings; and all .env* files are gitignored, with runtime secrets supplied from Azure Key Vault via managed identities (docs/security/secrets.md). Reported precisely: on main, apps/api/src/config/environment.ts still carries one hardcoded literal — a local-development HMAC fallback for JWT_SECRET. It is not a credential for any deployed system, because production fails closed and refuses to boot unless JWKS_URI, JWKS_ISSUER and JWKS_AUDIENCE are set, so the fallback cannot be used to accept forged tokens in a real deployment. It is nonetheless being removed outright for defense in depth: the change deletes the built-in default, makes AUTH_PROVIDER=jwks without JWKS_URI refuse to boot unless JWT_SECRET is set explicitly, and ships a throwaway value in .envrc.template and .env.dockercompose.example so local setup configures one deliberately. This entry will be tightened once that change is merged.


 Анализ 8/8

  • Статический анализ кода


    НЕОБХОДИМО применять по крайней мере, один инструмент анализа статического кода (помимо предупреждений компилятора и "безопасных" режимов языка) к любой предлагаемой основной версии создаваемого ПО до ее выпуска, если есть хотя бы один инструмент на свободном ПО, который реализует этот критерий на выбранном языке. [static_analysis]
    Средство анализа статического кода анализирует программный код (как исходный код, промежуточный код или исполняемый файл), не выполняя его с конкретными входами. Для целей этого критерия предупреждения компилятора и «безопасные» языковые режимы не считаются инструментами анализа статического кода (они обычно избегают глубокого анализа, поскольку скорость имеет жизненно важное значение). Примеры таких статических инструментов анализа кода включают cppcheck (C, C++), статический анализатор Clang (C, C++), SpotBugs (Java), FindBugs (Java; включая FindSecurityBugs), PMD (Java), Brakeman (Ruby on Rails), lintr (R), goodpractice (R), Анализатор качества Coverity, SonarQube, Codacy и статический анализатор кода HP Enterprise Fortify. Более крупные списки инструментов можно найти в таких местах, как Wikipedia list of tools for static code analysis, OWASP information on static code analysis, NIST list of source code security analyzers и Wheeler's list of static analysis tools. Если для используемого языка(ов) реализации нет доступных инструментов статического анализа на свободном ПО, выберите «неприменимо» (N/A).

    At least one static analysis tool with security relevance is applied to every proposed major production release, and in fact to every pull request. CodeQL runs the "security-and-quality" query suite on every push to main, every pull request, and on a weekly schedule, uploading results to GitHub code scanning (.github/workflows/codeql.yml). Alongside it: ESLint with typescript-eslint recommendedTypeChecked (full type-aware analysis), tsc --strict, zizmor auditing the GitHub Actions workflows for supply-chain and template-injection issues, Trivy scanning dependencies and container images, and betterleaks scanning git history for secrets. All of these are required status checks on pull requests to main. See https://github.com/undp/carbon-footprint-program/actions/workflows/codeql.yml.



    ЖЕЛАТЕЛЬНО включать по крайней мере в один из инструментов статического анализа, используемых для критерия static_analysis, правила или подходы для поиска распространенных уязвимостей в анализируемом языке или среде. [static_analysis_common_vulnerabilities]
    Инструменты статического анализа, специально предназначенные для поиска распространенных уязвимостей, с большей вероятностью найдут их. Тем не менее, использование любых статических инструментов обычно помогает найти какие-то проблемы, поэтому мы предлагаем, но не требуем этого для получения базового значка.

    CodeQL is configured with the "security-and-quality" query suite, which is explicitly a look for common vulnerability patterns — injection, path traversal, unsafe deserialization, SSRF, hardcoded credentials, prototype pollution and the rest of the JavaScript/TypeScript CWE coverage — rather than style-only checks. Results are uploaded to GitHub code scanning. It is complemented by Trivy for known-CVE scanning of dependencies and images and zizmor for GitHub Actions-specific vulnerability classes.



    Все уязвимости со средней и высокой степенью серьезности, обнаруженные при статическом анализе кода, НЕОБХОДИМО своевременно исправлять после их подтверждения. [static_analysis_fixed]
    Уязвимость имеет среднюю и высокую степень серьезности, если ее оценка по CVSS 2.0 - 4 или выше.

    Findings are fixed rather than accumulated, because the analyzers are blocking gates. "Lint" runs with --max-warnings=0 and "Type Check" fails on any error; both are required checks. The zizmor and Secret Scan jobs fail the build on any finding. CodeQL alerts appear in GitHub code scanning and are triaged by the maintainer team, with security-relevant work tracked as type:security issues. Where a Trivy finding cannot yet be acted on, it is recorded as an explicit, reviewed exception in .trivyignore.yaml rather than silently ignored.



    ЖЕЛАТЕЛЬНО выполнять анализ статического исходного кода при каждом коммите или по крайней мере ежедневно. [static_analysis_often]

    Static analysis runs far more often than at each release: CodeQL on every push to main, every pull request, and weekly on a schedule; ESLint, tsc, zizmor, betterleaks and Trivy on every pull request; and the OpenSSF Scorecard workflow weekly and whenever branch protection changes. So every proposed change is analyzed before it can merge, and the scheduled runs catch newly published advisories against unchanged code.


  • Динамический анализ кода


    ЖЕЛАТЕЛЬНО применять по крайней мере один инструмент динамического анализа к любой предлагаемой основной (major) версии программного обеспечения перед ее выпуском . [dynamic_analysis]
    Инструмент динамического анализа проверяет программное обеспечение, выполняя его с конкретными входными данными. Например, проект МОЖЕТ использовать инструмент фаззинг-тестирования (например, American Fuzzy Lop) или сканер веб-приложений (например, OWASP ZAP или w3af). В некоторых случаях проект OSS-Fuzz может быть готов применить фаззинг-тестирование к вашему проекту. Для целей этого критерия инструмент динамического анализа должен каким-то образом варьировать исходные данные, чтобы искать проблемы разного рода или быть автоматическим набором тестов с покрытием веток исполнения не менее 80%. Страница Википедии о динамическом анализе и cтраница OWASP о фаззинг-тестировании указывают некоторые инструменты динамического анализа. Использование инструмента/ов анализа МОЖЕТ, но не обязано быть сосредоточено на поиске уязвимостей в безопасности.

    No dedicated dynamic security analysis tool is applied yet. The project does exercise the running system extensively — 161 integration tests drive real HTTP requests through the API against a real PostgreSQL instance (Testcontainers), plus Azurite and MinIO for the storage paths, and Zod schemas validate every request and response at runtime — but that is a functional suite, not a fuzzer or web-application scanner. Adding a DAST scan or fuzzing of the HTTP surface is recognized as future work; this criterion is SUGGESTED, not required, for the passing level.



    ЖЕЛАТЕЛЬНО регулярно использовать по меньшей мере один динамический инструмент (например, fuzzer или сканер веб-приложения) в сочетании с механизмом для обнаружения проблем безопасности памяти, таких как перезапись буфера, если программное обеспечение, создаваемое проектом, включает части, написанные на небезопасном языке (например, C или C++). Если проект не создает программное обеспечение, написанное на небезопасном языке, выберите «неприменимо» (N/A). [dynamic_analysis_unsafe]
    Примерами механизмов обнаружения проблем безопасности памяти являются Address Sanitizer (ASAN) (доступен в GCC и LLVM), Memory Sanitizer и valgrind. Другие потенциально используемые инструменты включают Thread Sanitizer и Undefined Behavior Sanitizer. Достаточно широкое использование утверждений (assertions) тоже может быть приемлемо.

    The project is written in TypeScript running on Node.js (with a small amount of shell and Bicep). These are memory-safe, garbage-collected environments with no manual memory management, no pointer arithmetic and no unchecked buffer access, so the memory-safety checkers this criterion refers to (ASan/valgrind-class tools) do not apply. There is no C, C++ or other unsafe-language code in the codebase.



    ЖЕЛАТЕЛЬНО включать в ПО, создаваемое проектом, достаточно много утверждений (assertions) времени выполнения, проверяемых при динамическом анализе. Во многих случаях эти утверждения не должны попадать в сборки под эксплуатацию (production). [dynamic_analysis_enable_assertions]
    Этот критерий не предполагает включения утверждений на этапе эксплуатации; решение об этом полностью лежит на проекте и его пользователях. Вместо этого критерий направлен на улучшение обнаружения ошибок во время динамического анализа перед развертыванием. Использование утверждений при эксплуатации полностью отличается от такового во время динамического анализа (например, при тестировании). В некоторых случаях включать утверждения при эксплуатации крайне неразумно (особенно в компонентах с высокой степенью целостности). Существует множество аргументов против включения утверждений в выпускаемых сборках: например, библиотеки не должны вызывать сбой при вызове, присутствие утверждений может привести к отклонению магазинами приложений и/или активация их при рабочем использовании может привести к раскрытию частных данных, таких как закрытые ключи. Помните, что во многих дистрибутивах Linux NDEBUG не определен, поэтому C/C++assert() в таких рабочих средах по умолчанию будет включен. Может быть важно использовать другой механизм утверждений или определить NDEBUG для эксплуатации в этих средах.

    Runtime checks are enabled during test execution rather than compiled out. Every API request and response is validated against a Zod schema at the route boundary, and a schema violation throws — so the integration suite fails loudly on any contract breach, which is exactly the assertion behaviour this criterion asks for. TypeScript runs in strict mode, and the test environment additionally exercises the fail-closed configuration guards in apps/api/src/config/environment.ts. No assertion or validation layer is disabled in the test configuration.



    Проект ОБЯЗАН своевременно исправлять все уязвимости средней и выше степени серьезности, обнаруженные при динамическом анализе кода, после их подтверждения. [dynamic_analysis_fixed]
    Если вы не используете динамический анализ кода и, следовательно, не обнаружили уязвимостей таким способом, выберите «неприменимо» (N/A). Степень серьезности уязвимости считается средней или выше, если уязвимость имеет среднюю или выше базовую оценку по Common Vulnerability Scoring System (CVSS). В версиях CVSS с 2.0 по 3.1 это соответствует оценке 4.0 и выше. Проекты могут использовать оценку CVSS опубликованную в любой широко используемой базе данных по уязвимостям (такой как National Vulnerability Database) используя самую новую версию CVSS доступную в этой базе данных. Вместо этого проекты могут сами вычислять серьезность используя последнюю версию CVSS на момент раскрытия уязвимости, если вводные для вычисления раскрываются вместе с публикацией уязвимости.

    No dedicated dynamic analysis (fuzzing or DAST) is currently performed — see the dynamic_analysis criterion — so there are no dynamic-analysis findings, of medium severity or otherwise, outstanding to fix. Vulnerabilities discovered by any other route (CodeQL, Trivy, pnpm audit, Dependabot, or a private report under SECURITY.md) are triaged and fixed under the processes described in those criteria.



Эти данные доступны по лицензии Community Data License Agreement – Permissive, Version 2.0 (CDLA-Permissive-2.0). Это означает, что получатель данных может распространять данные с изменениями или без них, при условии, что получатель данных предоставляет текст данного соглашения вместе с распространяемыми данными. Пожалуйста, укажите в качестве источника Kevin Johnson и участников OpenSSF Best Practices badge.

Владелец анкеты на значок проекта: Kevin Johnson.
2026-07-29 16:37:34 UTC, последнее изменение сделано 2026-07-30 01:15:24 UTC. Последний раз условия для получения значка были выполнены 2026-07-29 16:59:38 UTC.