Wissen · Befundakte

Ein Keil-Build, ganz durchgesehen

Ein öffentlicher Keil-Build für einen Cortex-M4: welche Komponenten drinstecken und wo die Datei das belegt, welche gemeldete Lücke Code im Build hat, welche Härtung fehlt. Mit den Befehlen, die das nachprüfen.

Datei
ble_freertos_amota.axf
Größe
2.503.136 Bytes
Format
ELF32 · ARM · EABI 5
Ziel
Apollo3 · Cortex-M4
Analysiert
19.10.2026 · app.legacymind.de
SHA-256
f33f7663bbd8b3fb4da733c57b008e439265ac688438b5c637da3c890e19fd13
Inhalt
  1. 0Ergebnis
  2. 1Komponenten
  3. 2Schwachstellen
  4. 3Härtung
  5. 4SBOM
  6. 5Nachprüfen

0Ergebnis

  • 2von 6gemeldeten Lücken haben Code im BuildFreeRTOS 10.4.3 schließt beide, FreeRTOS 11.3.1 alle 6.
  • 3Schutzmechanismen fehlenStack Canary, MPU, Privilegientrennung.
  • 3Komponenten ohne Version im ImageArm Cordio BLE-Stack, micro-ecc, Ambiq HAL: ohne Version kein Abgleich gegen bekannte Lücken.

1Komponenten

Anhang I, Teil II Nr. 1

Sechs Komponenten, drei davon mit Version in der Datei. Jede Zeile nennt den Datei-Offset der Zeichenkette, die sie belegt.

  • FreeRTOS

    RTOS-Kernel

    10.1.1

    0x1fe9c · .debug_info, nur im AXF
    ../../../../../third_party/FreeRTOSv10.1.1/Source/timers.c
  • Arm Cordio BLE-Stack

    Bluetooth-Stack, in LegacyMind als exactle

    nicht belegt

    0x17f3c · FLASH, auch im BIN
    ../../../../../third_party/exactle/wsf/sources/port/freertos/wsf_trace.c

    Projektdatei: third_party/exactle; Arm Cordio r19.02 laut SDK-Readme (cordio_profile_readme.md:14). Im Image steht keine Version.

  • micro-ecc

    Krypto-Bibliothek, in LegacyMind als uecc

    nicht belegt

    0x4cd18 · .debug_info, nur im AXF
    ../../../../../third_party/uecc/uECC.h

    Projektdatei: third_party/uecc. Das SDK nennt keine Version.

  • Ambiq HAL

    Herstellertreiber, in LegacyMind als hal_ambiq

    nicht belegt

    0x2e14 · FLASH, auch im BIN
    ERROR_CHECK_VOID am_hal_ble_initialize(0, &BLE)

    Projektdatei: mcu/apollo3; AmbiqSuite 2.4.2 laut VERSION.txt. Im Image steht keine Version.

  • Arm C-Bibliothek (armlib)

    Laufzeitbibliothek, in LegacyMind als Arm C library (armlib)

    5.06 update 6 (build 750)

    0x1dbd5b · .comment, nur im AXF
    C:\Keil_v5\ARM\ARMCC\Bin\..\lib\armlib\c_w.l
  • Arm Compiler

    Toolchain

    5.06

    0x1fed7 · .debug_info, nur im AXF
    Component: ARM Compiler 5.06 update 6 (build 750) Tool: ArmCC [4d3637]

2Schwachstellen

Anhang I, Teil I Nr. 2 a

Die Analyse meldet sechs CVEs zu FreeRTOS 10.1.1. Die Symboltabelle derselben Datei sagt, bei welchen der betroffene Code gelinkt ist: bei zwei, bei vier nicht.

Code im Build · 2

  • CVE-2021-31571

    CVSS 9,8 · Kritisch

    Ganzzahl-Überlauf in queue.c beim Anlegen einer Queue.

    Behoben in FreeRTOS 10.4.3

    SymboladressexQueueGenericCreate 0x1fe85

  • CVE-2021-32020

    CVSS 9,8 · Kritisch

    Unzureichende Grenzprüfung in der Heap-Verwaltung des Kernels.

    Behoben in FreeRTOS 10.4.3

    SymboladressepvPortMalloc 0x1bfb5

Code nicht im Build · 4

  • CVE-2021-31572

    CVSS 9,8 · Kritisch

    Ganzzahl-Überlauf in stream_buffer.c beim Anlegen eines Stream-Buffers.

    Behoben in FreeRTOS 10.4.3

    Der Build enthält keinen Stream-Buffer: keine StreamBuffer-Funktion in der Symboltabelle.

  • CVE-2024-28115

    CVSS 8,8 · Hoch

    Unzureichender Schutz gegen Rechteausweitung auf MPU-Ports, falls eine andere Lücke Code einschleust.

    Behoben in FreeRTOS 10.6.2

    Betrifft nur MPU-Ports. Der Build nutzt den Port portable/Keil/AMapollo2 und enthält kein MPU_-Symbol.

  • CVE-2026-77234

    CVSS 8,8 · Hoch

    Fehlende Eingabeprüfung lässt auf MPU-Ports eine Task ohne Rechte Code im Kernel-Kontext ausführen.

    Behoben in FreeRTOS 11.3.1

    Betrifft nur MPU-Ports. Der Build nutzt den Port portable/Keil/AMapollo2 und enthält kein MPU_-Symbol.

  • CVE-2026-77237

    CVSS 6,5 · Mittel

    Fehlende Typprüfung in xQueueAddToSet() lässt auf MPU-Ports eine Task ohne Rechte Kernel-Speicher lesen.

    Behoben in FreeRTOS 11.3.1

    Betrifft nur MPU-Ports. Der Build nutzt den Port portable/Keil/AMapollo2 und enthält kein MPU_-Symbol.

Kein Abgleich · 3

  • Arm Cordio BLE-StackOhne Version im Image kein Abgleich gegen bekannte Lücken.
  • micro-eccOhne Version im Image kein Abgleich gegen bekannte Lücken.
  • Ambiq HALOhne Version im Image kein Abgleich gegen bekannte Lücken.

Den Abgleich mit der Symboltabelle haben wir für diese Akte mit nm gemacht; der Bericht führt heute alle sechs zur Version. CVSS wie im Bericht, Fix-Version laut NVD, keine der sechs im CISA-KEV-Katalog.

3Härtung

Anhang I, Teil I Nr. 2 k

Gemessen wie ein Mikrocontroller gemessen wird: RELRO, NX und PIE gibt es auf einem Cortex-M nicht.

  • Stack Canary

    fehlt

    Beleg

    Kein __stack_chk_guard, kein __stack_chk_fail in der Symboltabelle.

    Was ihn einschaltet

    Mit --protect_stack übersetzen (Arm Compiler 5), bei armclang mit -fstack-protector-strong.

  • MPU

    fehlt

    Beleg

    Kein MPU_-Symbol; der Build nutzt den Port portable/Keil/AMapollo2.

    0x20e04 · .debug_info, nur im AXF
    ../../../../../third_party/FreeRTOSv10.1.1/Source/portable/Keil/AMapollo2/portmacro.h

    Was ihn einschaltet

    Den MPU-Port von FreeRTOS für Cortex-M4 verwenden und die Speicherbereiche der Tasks festlegen.

  • Privilegientrennung

    fehlt

    Beleg

    Ohne MPU-Port laufen alle Tasks privilegiert; kein xPortRaisePrivilege in der Symboltabelle.

    Was ihn einschaltet

    Mit dem MPU-Port Tasks ohne Rechte anlegen (xTaskCreateRestricted).

4SBOM

Anhang I, Teil II Nr. 1

Die Stückliste als CycloneDX 1.6, so wie sie aus der App kommt.

ble_freertos_amota.cdx.json · Auszug
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:69d14c95-045e-4456-a0d0-c4309e7835c6",
  "metadata": {
    "component": {
      "type": "firmware",
      "name": "ble_freertos_amota.axf"
    }
  },
  "components": [
    {
      "type": "library",
      "name": "FreeRTOS",
      "version": "10.1.1",
      "purl": "pkg:generic/FreeRTOS@10.1.1",
      "cpe": "cpe:2.3:a:amazon:amazon_web_services_freertos:10.1.1:*:*:*:*:*:*:*"
    },
    {
      "type": "library",
      "name": "Arm C library (armlib)",
      "version": "5.06 update 6 (build 750)",
      "purl": "pkg:generic/Arm%20C%20library%20(armlib)@5.06%20update%206%20(build%20750)"
    },
    {
      "type": "application",
      "name": "arm compiler",
      "version": "5.06",
      "purl": "pkg:generic/arm%20compiler@5.06",
      "cpe": "cpe:2.3:a:arm:arm_compiler:5.06:*:*:*:*:*:*:*"
    },
    {
      "type": "library",
      "name": "exactle",
      "purl": "pkg:generic/exactle"
    },
    {
      "type": "library",
      "name": "hal_ambiq",
      "purl": "pkg:generic/hal_ambiq"
    },
    {
      "type": "library",
      "name": "uecc",
      "purl": "pkg:generic/uecc"
    }
  ]
}
Der CycloneDX-Export aus der App, gekürzt auf die Standardfelder Typ, Name, Version, purl und CPE.

5Nachprüfen

Drei Befehle wiederholen die Akte auf der Datei aus der Quelle oben: die Prüfsumme, die Datei-Offsets mit strings, die Symboladressen mit nm. Darüber die Abschnitte der Datei, damit jeder Offset seinen Ort hat.

Abschnitte der Datei, aus dem ELF-Kopf gelesen
Abschnitt         Offset     Größe     im BIN
FLASH             0x34       0x17fb8   ja
SRAM              0x17fec    0x954     ja
.debug_abbrev     0x18940    0x5c4     nein
.debug_frame      0x18f04    0x6f8c    nein
.debug_info       0x1fe90    0xe68fc   nein
.debug_line       0x10678c   0x366e4   nein
.debug_loc        0x13ce70   0x15a40   nein
.debug_macinfo    0x1528b0   0x60590   nein
.debug_pubnames   0x1b2e40   0x8122    nein
.symtab           0x1baf64   0x10f40   nein
.strtab           0x1cbea4   0xfd20    nein
.note             0x1dbbc4   0x1c      nein
.comment          0x1dbbe0   0x872cc   nein
.shstrtab         0x262eac   0x94      nein
Ist es dieselbe Datei?
sha256sum ble_freertos_amota.axf
Ausgabe auf dieser Datei
f33f7663bbd8b3fb4da733c57b008e439265ac688438b5c637da3c890e19fd13  ble_freertos_amota.axf
Datei-Offsets der Zeichenketten aus Abschnitt 1
for s in "FreeRTOSv10.1.1" "third_party/exactle/" "third_party/uecc/" "am_hal_ble_initialize" "armlib\\c_w.l" "Component: ARM Compiler 5.06"; do strings -a -t x ble_freertos_amota.axf | grep -m1 -F "$s"; done
Ausgabe auf dieser Datei
  1fe9c ../../../../../third_party/FreeRTOSv10.1.1/Source/timers.c
  17f3c ../../../../../third_party/exactle/wsf/sources/port/freertos/wsf_trace.c
  4cd18 ../../../../../third_party/uecc/uECC.h
   2e14 ERROR_CHECK_VOID am_hal_ble_initialize(0, &BLE)
 1dbd5b C:\Keil_v5\ARM\ARMCC\Bin\..\lib\armlib\c_w.l
  1fed7 Component: ARM Compiler 5.06 update 6 (build 750) Tool: ArmCC [4d3637]
Symboladressen: welche Funktion gelinkt ist, welche fehlt
nm ble_freertos_amota.axf | grep -E "xQueueGenericCreate|pvPortMalloc|StreamBuffer|MPU_|__stack_chk|xPortRaisePrivilege|xTaskCreateRestricted"
Ausgabe auf dieser Datei
0001bfb5 T pvPortMalloc
0001fe85 T xQueueGenericCreate

Ausgeführt mit GNU nm (GNU Binutils for Ubuntu) 2.42 und GNU strings auf der Datei mit dem SHA-256 oben, am 20.10.2026.

Fragen zur Akte

Warum steht bei drei Komponenten keine Version?
Für Arm Cordio BLE-Stack, micro-ecc, Ambiq HAL stehen in der Datei Quellpfade und Assert-Texte, aber keine Versionsnummer. Die Akte lässt das Feld leer, statt sie aus dem SDK zu übernehmen.
Warum nur Lücken zu FreeRTOS?
Abgleichen lässt sich nur, was eine Version trägt. Für Compiler und Laufzeitbibliothek meldet die Analyse in diesen Versionen keine bekannten Lücken; die drei Bibliotheken ohne Version bleiben ohne Abgleich.
Welche Datei sollen wir hochladen, das AXF oder das BIN?
Das AXF, ELF oder OUT des Builds. In dieser Akte stehen FreeRTOS 10.1.1 und Arm C-Bibliothek 5.06 update 6 (build 750) und Arm Compiler 5.06 nur in Abschnitten, die ins BIN nicht übernommen werden (.debug_info, .comment); ein BIN allein liefert nur, was seine Bytes selbst belegen. Laden Sie beide desselben Builds hoch, bekommt das BIN die Komponenten des AXF.
Brauchen Sie unseren Quellcode oder unser Build-System?
Nein. Die Analyse läuft auf der Datei, die Ihr Build erzeugt, oder auf dem Image, das Ihr Kunde bekommt. Kein Repository, kein Zugang zu Ihrer Toolchain, kein Zugriff auf das Gerät.
Was heißt das für die Meldepflicht nach Art. 14?
Keine der 6 gemeldeten Lücken steht im CISA-KEV-Katalog der aktiv ausgenutzten. Wird eine davon ausgenutzt, ist die erste Frage der 24-Stunden-Frist, welche ausgelieferten Produkte FreeRTOS 10.1.1 enthalten. Mit einer Stückliste je Release ist das eine Suche. Melden müssen Sie selbst.

Dieselbe Durchsicht für Ihren Build

Im kostenfreien CRA-Readiness-Check analysieren wir eine Datei Ihres Builds. Bericht und SBOM bekommen Sie binnen drei Werktagen.