Skip to content

[Triage] Markdown ignore (PYSEC-2026-89) reasons only about the audited Python env, while the one reachable markdown consumer is the docker-compose TensorBoard image (tensorflow/tensorflow… (CR-A16-116) #827

Open

Description

@cemililik

Needs triage. Reviewers disagreed on this finding, so it is not counted in the backlog. Decide whether it is a real defect: if yes, set severity and wave; if not, close it with the reason.

CR-A16-116 — Markdown ignore (PYSEC-2026-89) reasons only about the audited Python env, while the one reachable markdown consumer is the docker-compose TensorBoard image (tensorflow/tensorflow:2.15.0), fed TC-U H…

severity Low · confidence disputed · single reviewer · reproduced (plumbing only)

What happens. The entry concedes the DoS is 'genuinely remote' and justifies suppression with 'Installed markdown 3.10.2 is post-fix' (tools/pip_audit_ignores.yaml:157-162). That holds for the env the nightly audits: the project venv has markdown 3.10.2 and the extras, latest and lower venvs have 3.11. But forgelm/ never imports markdown. In the dependency stack the only importer is tensorboard/plugin_util.py:23, the TensorBoard server's text-plugin renderer (text_plugin.py:174-185 -> markdown_to_safe_html), and TC-U text reaches it by default. report_to defaults to 'tensorboard' (forgelm/config.py:604-605), forgelm/trainer.py:519 passes it to TrainingArguments, and transformers' TensorBoardCallback.on_train_begin writes add_text('model_config', model.config.to_json_string()) (integration_utils.py:627-632). The model config comes from the Hub repo's config.json (IN-07, TC-U), and unknown keys survive to_json_string. The project ships the renderer as its own docker-compose service: image: tensorflow/tensorflow:2.15.0, logdir ./output, --host=0.0.0.0, port 6006 published (docker-compose.yaml:50-61). The nightly pip-audit audits only the runner's pip install -e .[security] env (.github/workflows/nightly.yml:294-327), so the markdown that actually renders attacker-influenced text is outside both the gate and this entry's reasoning. Whether that image's markdown falls in CVE-2025-69534's affected range could not be established offline (see research questions). This is not a gate fail-open: the gate would not see the image with or without the ignore.

Failure scenario. An operator fine-tunes a Hub model whose config.json carries a malformed HTML-like string, then opens the shipped TensorBoard service. If the image's markdown is in the affected range, the text plugin's parse raises AssertionError on that summary: the text tab fails (DoS of the dashboard request), and the service listens on 0.0.0.0:6006. Impact is availability of a monitoring UI only.

Where.

Evidence.

  • Dynamic, extras venv: a crafted key ('attacker_note': '<![ crafted <!x-- payload') added to a copy of env/tiny-qwen/config.json survives AutoConfig.from_pretrained(...).to_json_string(). tensorboard.plugin_util.markdown_to_safe_html renders it (markdown 3.11, no crash, 855 chars). Library lines, extras venv: transformers/integrations/integration_utils.py:627-632 (add_text args / model_config), :647 (add_text for string log values); tensorboard/plugins/text/text_plugin.py:174-185; tensorboard/pl…

Recommended fix. Scope the entry's claim to 'the nightly-audited env', and either audit or bump the compose TensorBoard image: pin a tensorboard image or pip-install tensorboard plus markdown>=3.8.1 in it. Optionally bind the service to 127.0.0.1. Re-verify the version claim (installed is now 3.10.2 or 3.11).


Found by the October 2026 ForgeLM code and documentation review against commit cab2947. Code links point at that commit; line numbers may have moved since. Finding IDs (CR-…, DOC-…, TECH-…) are stable references for this backlog.

Activity

  1. added
    bugSomething isn't working
    needs-triageNot triaged yet: every new issue starts with it; only a maintainer removes it
    source: review-2026-10Found by the October 2026 code and documentation review
    on Oct 9, 2026
  2. cemililik commented on Oct 20, 2026

    @cemililik
    CollaboratorAuthor

    The scoping point is right: this entry accepts the advisory for the environment the nightly pip-audit installs (forgelm/ never imports markdown; it only arrives through tensorboard), and says nothing about the markdown inside the docker-compose TensorBoard image.

    That image (tensorflow:2.15.0, last pushed in November 2023) most likely bundles a markdown older than the 3.8.1 fix, and the nightly never scans it. This is not a fail-open of the gate, and the exposure is limited to the optional TensorBoard service.

    Plan: reword the entry to state its scope and the version rule (markdown >= 3.8.1) instead of '3.10.2', refresh verified_at, and add the bundled-markdown requirement to #524, where the image itself gets replaced.

    Triage result: documentation, area: packaging-ci, security (like the other supply-chain gate items, e.g. #516), severity: low, wave: 4. The advisory is public, so nothing sensitive is discussed here.

    Triage round 1, checked against development on 2026-10-20.

  3. added
    documentationImprovements or additions to documentation
    securitySecurity-relevant
    severity: lowMinor defect, inaccuracy or rough edge
    wave: 4Roadmap wave 4: low / info / watch, when touching the module
    on Oct 20, 2026
  4. removed
    needs-triageNot triaged yet: every new issue starts with it; only a maintainer removes it
    on Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: packaging-ciCode area: packaging-cidocumentationImprovements or additions to documentationsecuritySecurity-relevantseverity: lowMinor defect, inaccuracy or rough edgesource: review-2026-10Found by the October 2026 code and documentation reviewwave: 4Roadmap wave 4: low / info / watch, when touching the module

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions