Aller au contenu principal

Versions de paquets téléchargées

Un résultat de dépendance indique qu’une version est déclarée quelque part. Le recensement des téléchargements dit autre chose : quelles versions de paquets ont réellement été téléchargées, par quel consommateur, et à quand cela remonte. Il est compté à partir du journal d’accès au registre ; il couvre donc vos propres paquets dans le registre fremforge et les paquets que votre organisation télécharge via le proxy de dépendances, y compris les téléchargements depuis une CI extérieure à fremforge qui utilise un robot de registre.

Depuis le 2026-10-13, un téléchargement qu’une tâche Forgejo Actions effectue via le proxy de dépendances, et que le proxy sert depuis son cache, est compté ici directement et n’est pas stocké comme événement dans le journal d’accès (voir journal d’accès au registre). Le recensement est donc la trace de ces téléchargements : par jour UTC, version de paquet et dépôt, avec les exécutions qui les ont effectués.

Ce qui compte comme téléchargement

Un téléchargement est une récupération réussie qui nomme une version : une archive npm, un fichier PyPI, un artefact Maven, un paquet NuGet, un zip de module Go, un fichier générique ou d’un autre registre, ou une image de conteneur tirée par tag. Ne sont pas comptés :

  • les lectures de métadonnées, comme un packument npm ou un index simple PyPI ;
  • les requêtes refusées ;
  • les téléchargements de couches de conteneurs, qui ne nomment qu’un digest.

Un téléchargement qu’une politique en mode observation aurait refusé, mais a laissé passer, compte comme téléchargement.

Consommateurs

Chaque téléchargement est attribué au consommateur enregistré par le journal d’accès :

TypeQuiDésigné par
jobUn jeton de tâche Forgejo ActionsLe dépôt de la tâche, <owner>/<repo>. run_ids liste les exécutions Actions qui ont téléchargé la version
robotUn robot de registreLe nom du robot. login contient son utilisateur bot
botUn autre bot système fremforgeSon identifiant
userLe jeton ou la session d’une personneSon identifiant
anonymousUne requête sans identifiantRien

Quelles alertes sont rapprochées

  • Les versions téléchargées via le proxy de dépendances (npm, PyPI, Maven, NuGet et Go) sont comparées à l’index d’alertes OSV qu’évalue la politique de paquets du proxy. Les plages de versions sont évaluées, et pas seulement les versions exactes. source vaut advisory_index.
  • Les versions de vos propres paquets du registre portent les résultats ouverts de ce fichier de paquet, les mêmes résultats que lit la politique de paquets. Les résultats écartés et résolus sont exclus. source vaut package_findings.
  • Les images de conteneurs sont comptées, mais cette liste n’affiche aucune alerte pour elles. Les résultats d’image figurent sur les pages d’analyse des images.

Dans la console

Dans l’administration de l’organisation, ouvrez Sécurité › Composants › Versions téléchargées. La page liste les mêmes versions que l’API, dans le même ordre et avec les mêmes filtres : nom du paquet, période (aujourd’hui, ou les 7, 30, 90 ou 365 derniers jours), gravité minimale, écosystème, source (votre propre registre ou le proxy de dépendances), type de consommateur et consommateur. Cochez Inclure les versions sans avis connu pour voir toutes les versions téléchargées, et pas seulement les vulnérables. Chaque ligne indique la gravité la plus élevée, jusqu’à trois alertes avec une version corrigée, le nombre de téléchargements par type de consommateur, les principaux consommateurs, et la date du dernier et du premier téléchargement de la version. La ligne au-dessus du tableau indique jusqu’à quand les événements d’accès ont été comptés. Page suivante et Première page permettent de parcourir la liste ; Exporter en CSV télécharge toutes les versions correspondant aux filtres actuels, dans les mêmes colonnes que le CSV de l’API.

Lecture avec l’API

Avec un jeton d’API qui porte components:read ou findings:read :

curl -sS -H "Authorization: Bearer $FFP_TOKEN" \
  "https://frem.sh/_app/api/v1/orgs/acme/components/pulled?days=30&min_severity=high"

Par défaut, la liste ne contient que les versions vulnérables, les plus graves d’abord, puis les plus récemment téléchargées. Chaque élément comporte la version et son purl, la severity la plus élevée, les advisories avec leurs versions corrigées, le total des pulls, les téléchargements par type de consommateur, first_seen_at et last_seen_at, et jusqu’à dix consumers avec leurs propres comptes et dates. Un consommateur job a aussi des run_ids : jusqu’à 20 identifiants d’exécution Actions (GITHUB_RUN_ID) qui ont téléchargé la version pendant la période, les plus récents d’abord.

FiltreSignification
daysNombre de jours UTC en arrière, aujourd’hui compris : de 1 à 730, 30 par défaut
vulnerabletrue (par défaut) pour les versions ayant une alerte ouverte ; false pour toutes les versions téléchargées
min_severitylow, medium, high ou critical
ecosystemLe type de paquet : npm, pypi, maven, nuget, go, container, …
originregistry (vos propres paquets) ou proxy (le proxy de dépendances)
nameUn nom de paquet, exact
consumer_kindjob, robot, bot, user ou anonymous
consumerUn dépôt (owner/name), un nom de robot ou un identifiant
run_idUn identifiant d’exécution Actions (GITHUB_RUN_ID) : uniquement les versions téléchargées par cette exécution

Pour voir ce qu’un build a téléchargé, passez son identifiant d’exécution avec vulnerable=false :

curl -sS -H "Authorization: Bearer $FFP_TOKEN" \
  "https://frem.sh/_app/api/v1/orgs/acme/components/pulled?run_id=123456&vulnerable=false&days=7"

Passez le next_cursor d’une page comme cursor pour obtenir la page suivante, avec les mêmes filtres, et arrêtez-vous lorsqu’il vaut null. Une page contient jusqu’à 500 versions (limit). Ajoutez format=csv pour obtenir toutes les versions correspondantes au format CSV. Une requête qui correspond à plus de 50 000 versions répond 413 too-many-rows ; affinez-la. Voir la référence de l’API pour la forme complète.

Fraîcheur et durée de conservation

Le recensement est agrégé à partir du journal d’accès toutes les heures. window.rolled_up_to dans la réponse indique jusqu’à quand les événements d’accès ont été comptés. Les téléchargements de CI servis depuis le cache du proxy de dépendances sont ajoutés à mesure qu’ils arrivent, sans attendre l’agrégation horaire.

Le recensement suit la conservation des preuves du journal d’accès, et il est supprimé par la même tâche quotidienne : les comptes d’une journée disparaissent dès que le téléchargement le plus récent qu’ils comptent dépasse la durée de conservation access_log, ou la durée access_log_ci pour les téléchargements de CI via le proxy de dépendances. Tant qu’une conservation légale est en place, rien n’est supprimé.

Dans l’export de données

Chaque export de données contient le recensement sous la forme metadata/pulled-versions.ndjson, une ligne par jour UTC, version de paquet et consommateur : les lignes que cette page additionne. Voir Export schema. Les alertes ne figurent pas dans le fichier : elles sont rapprochées au moment où vous lisez la liste, à partir de données d’alertes qui évoluent dans le temps.

Limites

  • Un téléchargement n’est pas un déploiement. Une version peut être téléchargée par un build sans jamais être livrée, ou téléchargée une fois et mise en cache pendant des mois.
  • Les téléchargements depuis des caches extérieurs à fremforge ne sont pas vus. Seules les requêtes qui atteignent le registre fremforge ou le proxy de dépendances sont comptées.
  • Les équipes ne sont pas enregistrées. Le téléchargement d’un utilisateur est attribué à cet utilisateur.
  • Les identifiants d’exécution sont conservés depuis le 2026-10-13. Par jour UTC, version de paquet et dépôt, les 100 exécutions les plus récentes sont conservées ; un dépôt qui lance plus de 100 builds par jour téléchargeant la même version conserve le compte de chaque téléchargement, mais uniquement les identifiants des 100 exécutions les plus récentes.
  • Le recensement n’enregistre ni quelle tâche d’une exécution a téléchargé une version, ni l’heure exacte de chaque téléchargement, seulement le premier et le dernier de la journée.