Understanding output¶
Every check produces two things: a value (the text, e.g. Full RELRO) and a
status that drives the color. The status is the quickest way to read a
report at a glance.
Color legend¶
| Swatch | Status (JSON/XML/YAML) | Meaning |
|---|---|---|
| green | green |
Good. The mitigation is present and effective. |
| yellow | yellow |
Warning. Partial protection, or checksec could not determine the state (see Unknown below). |
| red | red |
Bad. The mitigation is missing/disabled, or an error occurred reading the binary. |
| plain | unset |
Informational. Neutral facts that aren't good or bad — counts, DSO, the active sanitizer set. |
| italic | italic |
Not applicable. The check doesn't apply to this kind of binary. |
In the terminal these map to ANSI colors; in json/xml/yaml they appear as
the literal status string shown above. Color can be forced or disabled with
--color always|never.
Unknown vs N/A¶
These two look similar but mean different things — this is the most common point of confusion (see issue #346).
Unknown (yellow) — checksec couldn't tell
The check ran, but the binary didn't carry enough information to reach a
verdict. The classic example is FORTIFY Lvl → Unknown: the FORTIFY
level is read from annobin compiler
notes, and this binary was built without annobin (common outside
RHEL/Fedora toolchains). checksec can't prove the level either way, so it
reports Unknown rather than guessing.
Unknown is not a failure — it means "indeterminate." Other checks that
can report Unknown include CFI,
Stack Clash, and
GLIBCXX assertions.
N/A (italic) — the check doesn't apply
The mitigation is meaningless for this binary type. For example,
W^X segment reports N/A for relocatable
object files (.o) that have no loadable segments to check.
Status values¶
The machine-readable status field takes one of these literal values:
status |
Color | Source constant |
|---|---|---|
green |
green | StatusGood |
yellow |
yellow | StatusWarn |
red |
red | StatusBad / StatusError |
unset |
plain | StatusInfo |
italic |
italic | StatusNA |
Each check's report also has a stable key (the JSON/YAML map key, e.g.
relro, fortify_level). Those keys are what you pass to
--fail-if, and they're listed on every
check reference page.
Reading a row¶
RELRO Stack Canary CFI ...
Full RELRO Canary Found Unknown ...
▲ ▲ ▲
green green yellow → "good, good, couldn't determine CFI"
A healthy modern binary is mostly green with a few neutral/plain columns. Yellow and red are the cells worth investigating — head to the relevant check reference page to learn what the value means and how to fix it.