custom_audit, judges your own checks on the server and reports only verdicts.
| Collector | Reports | Platforms |
|---|---|---|
packages_system | OS packages (dpkg, rpm, apk, Homebrew), installed programs on Windows (including Chocolatey) and applications on macOS, the OS release, and the Windows build or macOS version | Linux, Windows, macOS |
packages_app | Application libraries and runtimes outside the package manager, each with its install path. On Windows also the exact build of Microsoft 365 Apps and Office, SQL Server, Exchange Server and .NET Framework 4.x | Linux, Windows, macOS |
host_config | Configuration facts for the hardening benchmarks | Linux, Windows, macOS |
custom_audit | A verdict, a short reason and at most 256 redacted characters of evidence for each check in the custom audits assigned to the server | Linux, Windows, macOS |
Application software
packages_app reports each item under the identity the vulnerability matcher uses, with the real path where it is installed:
| Type | What is read |
|---|---|
| Java | Every JAR, WAR and EAR, Jenkins plugins, and archives nested inside them (WEB-INF/lib, BOOT-INF/lib). Identified from the pom.properties Maven writes into each artifact. A JAR without one is identified from its classes and manifest: Log4j 2 and Log4j 1.x, Spring, Jackson, Netty, Commons Text, Commons Collections and SnakeYAML. A version is reported only when the manifest belongs to that library and its version attributes agree. Log4j 2 classes shaded into another JAR, whose version cannot be established, are noted in the scan’s coverage details instead of being guessed. |
| Node.js | node_modules trees, including global installs |
| Python | site-packages in any interpreter or virtualenv |
| .NET | *.deps.json |
| PHP | vendor/composer/installed.json and composer.lock |
| Ruby | Gemfile.lock and gem directories |
| Go | The module list the Go linker embeds in each binary. The binary is parsed, never executed. |
| Runtimes and servers | Java (JDK and JRE, with Oracle JDK told apart from OpenJDK), Apache Tomcat, Node.js, Python, PHP, nginx, Apache httpd, PostgreSQL, MariaDB, MySQL, Redis, OpenSSL, WildFly and the .NET runtime, when installed from a tarball, an installer or a build rather than the OS package manager |
| Application servers and databases, by patch level | Oracle WebLogic Server, Oracle Database (the server), IBM WebSphere Application Server (traditional and Liberty) and Red Hat JBoss EAP. See Application servers and databases. |
openjdk-17-jdk or nginx package, is reported by packages_system and matched against the distribution’s advisories, which include the fixes the distribution backports. It is not reported a second time as upstream software.
MySQL and Redis are reported only when the installation shows its version (a version header or a versioned directory); a bare binary does not name its version reliably. OpenSSL is read from the version banner in its libraries.
Application servers and databases
For these products a version alone says almost nothing. Oracle’s advisories name the base release as affected (WebLogic 12.2.1.4.0, Database 19c), and a quarterly patch leaves that number unchanged. Matching the base release would report every CVE ever published against a fully patched server. So the agent reads the patch level from the files the vendor’s own installer and patch tool wrote into the install, and the version it reports carries it.| Product | Files read | Reported version |
|---|---|---|
| Oracle WebLogic Server | <Oracle Home>/inventory/registry.xml for the release; for each applied patch, the <patch_description> at the top of <Oracle Home>/inventory/oneoffs/<patch id>/etc/config/inventory.xml | The newest WLS PATCH SET UPDATE or WLS STACK PATCH BUNDLE, for example 14.1.1.0.250630. 12.2.1.4.0 for a home no patch was ever applied to. |
| Oracle Database (server) | The oracle.server component in <Oracle Home>/inventory/ContentsXML/comps.xml; the same oneoffs patch descriptions | The newest Database Release Update, Patch Set Update or Bundle Patch, for example 19.21.0.0.231017. 19.0.0.0.0 for an unpatched home. |
| IBM WebSphere Application Server (traditional) | <install>/properties/version/*.product | The fix pack, for example 9.0.5.24 |
| IBM WebSphere Liberty | <install>/lib/versions/WebSphereApplicationServer.properties | The Liberty release, for example 26.0.0.6 |
| Red Hat JBoss EAP | bin/product.conf, and the product module’s MANIFEST.MF under modules/system/layers/base/org/jboss/as/product/<slot>/dir/META-INF/, in the base layer and in every cumulative-patch overlay under .overlays/ | The newest, for example 7.4.10.GA |
| WildFly | The same product module manifest (WildFly 25 and later have no version.txt), or version.txt in older releases | For example 26.1.3.Final, assessed like the other runtimes in the table above |
opatch, versionInfo or any other program from the install, and it never connects to a database: an Oracle home is recognised from its files, and no listener, instance or account is involved. Each file is read up to a fixed size and a home’s patch directory up to a fixed number of entries. Windows installs use the same layout.
When the patch level cannot be read. If the inventory is missing, unreadable by the agent’s account, or lists patches none of which the agent recognises as a quarterly update, the home is still reported, as for example 12.2.1.4.0 (patch level unknown). TigerGate does not assess it: no CVE is raised on the base release and none is closed, and the package shows as Not assessed. The server’s coverage details count these homes. A home with an intact inventory and no applied patch is a different, certain state, and is reported as unpatched. To read an inventory the agent’s account cannot open, install in privileged mode or give the account read access to inventory/.
How a CVE is matched. For WebLogic and Oracle Database, TigerGate takes the date of the Oracle advisory that fixes the CVE from the advisory link in its National Vulnerability Database record (oracle.com/security-alerts/cpuapr2023.html) and compares it with the date inside the installed patch’s version (12.2.1.4.230329 is dated 2023-03-29). A patch built up to 50 days before an advisory counts as carrying its fixes, because Oracle builds each quarterly patch before the advisory is published. Oracle Database records that give Release Update numbers (19.3 through 19.31) are matched by number. For WebSphere and JBoss EAP the fix pack or update is compared with the ranges in the record.
Limits.
- A WebSphere interim fix (iFix) does not change the product version, and NVD names fix packs, not iFixes, so a CVE fixed on a server by an iFix alone stays open until a fix pack that contains it is installed.
- A monthly Oracle Critical Security Patch Update applied on top of the latest quarterly patch is not recognised, so a CVE fixed only by it stays open until the next quarterly patch.
- Some NVD records for a CVE that Oracle lists in several advisories (a third-party library such as jQuery) are dated at the earliest advisory, which can hide that CVE on a server that is already several quarters behind.
- NVD names some JBoss EAP CVEs against the base release (
7.4) without a fixed update. Those match a 7.4.0 install and no later update; a CVE with a fixed update in its record is matched normally. - Open Liberty (
io.openliberty) is a different product and is not read as WebSphere.
Third-party applications
Software that no package-manager advisory feed covers is assessed against the National Vulnerability Database for a curated list of widely used products: Chrome, Edge, Firefox, Adobe Acrobat and Reader, Zoom, Oracle Java, Python, Node.js, OpenSSL, MySQL, Redis, 7-Zip, Notepad++, PuTTY, WinRAR, VLC, VMware Tools, Wireshark, Git, FileZilla, WinSCP, TeamViewer, AnyDesk and KeePass. This applies to Windows programs, Chocolatey packages, Mac applications, Homebrew packages, and the server software above. Oracle WebLogic Server, Oracle Database, IBM WebSphere Application Server and Red Hat JBoss EAP are assessed against the same database, by patch level as described above. Anything not on the list shows as Not assessed, never as clean. NVD can take days to analyse a new CVE, so a finding can trail the vendor’s fix by that much.Microsoft server products (Windows)
A security update for SQL Server, Exchange, Office or .NET changes the product’s build, not the version shown in Programs and Features. Windows keeps the install-time version there (“SQL Server 2019”, 15.0.2000.5, forever), sopackages_app reads each product’s current build from where the product itself records it, and TigerGate compares that build with the fixed build Microsoft publishes for the product’s servicing branch.
| Product | What is read | Where |
|---|---|---|
| Microsoft 365 Apps and Office (Click-to-Run) | The installed build (OfficePackageVersion) and the update address the install follows (CDNBaseUrl, cross-checked against UpdateChannel) | HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Inventory\Office\16.0 and …\ClickToRun\Configuration |
| SQL Server | Each instance’s PatchLevel and install directory (SQLPath) | HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL, then …\<instance id>\Setup, in both registry views |
| Exchange Server | The file version of ExSetup.exe, in the install directory recorded in MsiInstallPath | HKLM\SOFTWARE\Microsoft\ExchangeServer\v15\Setup and <install directory>\Bin\ExSetup.exe |
| .NET Framework 4.x | The Release value (which names the 4.x version) and the file version of clr.dll, which is what a security update changes | HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full and %SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\clr.dll |
| .NET, ASP.NET Core and Windows Desktop runtimes | The version in each shared\Microsoft.NETCore.App, Microsoft.AspNetCore.App and Microsoft.WindowsDesktop.App directory, with its path (the runtime directories the agent already reads) | The dotnet installation directory |
HKLM\SOFTWARE, which ordinary users can read by default, and the version resource of two files. The agent writes nothing, starts no program, and never connects to SQL Server or Exchange, so it needs no database login. If a key is refused, the scan’s coverage says that those products are unknown, not absent, and no finding for them closes until a scan can read them.
The build alone does not always tell TigerGate which servicing branch to judge it by, so the branch is part of what is matched:
- SQL Server is judged on its GDR or its cumulative-update branch, told apart by the build ranges Microsoft publishes for each release. A GDR build is never judged by a cumulative-update fix, or the reverse. A build outside the ranges, such as SQL Server 2016 SP2 or earlier, is shown as not assessed.
- Exchange is judged within its cumulative update: a CU14 server against CU14’s security updates, a CU15 server against CU15’s.
- Office is judged against the build its own update channel received. Current Channel and Monthly Enterprise Channel share version numbers and differ in the last part of the build, so the channel decides. Microsoft does not publish a fixed build per channel through MSRC; TigerGate reads Microsoft’s Office security release notes for it. A channel with no published build list (Beta, Preview) is shown as not assessed, and so is a server whose channel change is still pending.
- .NET Framework is judged on its 4.x line and the Windows release it runs on.
- .NET runtimes are judged against Microsoft’s own .NET release metadata. On Windows this replaces the Trivy match for the same install, so one runtime is never reported twice.
Where the agent searches
The agent searches the whole local disk, except the operating system’s and package manager’s own directories. It searches in this order, so that if a scan reaches a limit, what is cut short is the least likely place for server software:- Directories you named with
--app-pathand--runtime-home. - Locations found from what the server runs (see below).
- The usual application directories.
- The rest of the local disk.
- Home directories.
- Linux
- Windows
- macOS
Usual application directories:
/opt, /srv, /app, /apps, /usr/local, /var/www, /usr/lib/node_modules, /var/lib/gems, /var/lib/tomcat*, /var/lib/jetty*, /var/lib/jenkins, /var/cache/jenkins and /usr/share/jenkins.Rest of the disk: every other top-level directory, such as /u01, /data, /export or /mnt, and every directory under /var that is not the system’s own, such as /var/opt.Home directories: /home and /root.- Running processes: the executable (a JDK at
/u01/jdk1.8.0_202from/u01/jdk1.8.0_202/bin/java), a JVM’s-jar,-cpand-D<name>.homearguments, and a script’s directory (node server.js,python app.py). - Service definitions: systemd units on Linux, services on Windows, launchd daemons on macOS.
- Environment variables:
JAVA_HOME,JRE_HOME,JDK_HOME,CATALINA_HOME,CATALINA_BASE,JBOSS_HOME,WILDFLY_HOME,DOTNET_ROOT,PYTHONHOME,NODE_HOME,WL_HOME,WEBLOGIC_HOME,MW_HOME,ORACLE_HOME,WAS_HOME,WLP_INSTALL_DIR, and the home variables of common Java servers (Kafka, Elasticsearch, Solr, Jenkins, Spark, Hadoop, Jetty, Cassandra and others). - Application servers and databases: a JVM’s
-Dweblogic.home,-Dwls.homeand-Dwas.install.root, a Liberty server’s-jar .../bin/tools/ws-server.jar, and an Oracle Databasebin/oracle(theOracleServiceservice on Windows) beside an Oracle inventory. On Linux the agent usually cannot read another account’s process details, so an Oracle home owned by anoracleaccount is found by the disk search or with--runtime-homeinstead. - Your options: directories given with
--app-pathand runtimes given with--runtime-home. See Install the agent on servers.
What is not searched
- The operating system’s own directories:
/usroutside/usr/local,/var/liband the other system directories under/var,/etc,/boot,/lib,/binand/sbinon Linux;Windowsand system folders on Windows;/Systemand/Libraryon macOS. Software there belongs to the package manager, whose packages are already assessed against the distribution’s advisories. - Temporary and runtime directories:
/tmp,/run,/proc,/sysand/dev. - Network file systems (NFS, SMB/CIFS, Ceph, GlusterFS, sshfs and similar), container overlay file systems, and snap images. Container images are covered by container scanning.
- Data directories of databases and message brokers (PostgreSQL, MySQL, MariaDB, MongoDB, Elasticsearch, OpenSearch, Kafka). Outside the usual application directories, a directory with more entries than an application directory would hold is also skipped. Both are counted in the scan’s coverage details.
- Caches, download stores and version-control directories, for example
.m2,.gradle,.npm,.cache,.nuget,.pnpm-storeand.git. A Maven repository is a download history, not a deployment.
--app-path.
Directories the agent cannot read
On Linux the agent runs as the account that installed it, not root. A default directory it cannot open, such as/root or another account’s home, is skipped and counted in the scan’s coverage details as a fact. It does not stop findings from closing. A directory you named with --app-path that cannot be read is different: the scan is marked incomplete for application packages, and findings for them stay open until it can be read.
For processes owned by another account, Linux shows the agent only the command line, so the agent learns about them from the command line and the service definition.
Hardening facts (Linux)
host_config reads kernel parameters, mount options, file permissions and owners, the SSH server configuration, service and kernel-module state, password, lockout and umask policy, audit and logging configuration, and firewall state. See Hardening for the checks.
It never reports a secret. The shadow file is read only to count accounts with an empty password, never for a hash. The GRUB configuration is read only for whether a password is set. The sudoers file is read only for its Defaults lines.
Hardening facts (Windows)
On Windows,host_config reads Windows registry policy values under HKEY_LOCAL_MACHINE, which any account can read, and, with privileged mode, the local security policy, user rights and audit policy (secedit and auditpol). The registry values are a fixed list compiled into the agent, taken from the DISA STIG rules and Microsoft’s Group Policy reference. host_config never reads a path it is sent; the paths you choose are read only by custom_audit, below. A value that does not exist is not reported, which is what a policy that was never written looks like. A value the account is refused is marked, and only the controls that need it show Not assessed.
To tell a server from a client, and a domain controller from a member server, the agent also reports the product type, the installation type, the product name and the build number. A Windows banner is reported only as whether one is set, never its text.
Custom audits
custom_audit fetches the audits assigned to the server and evaluates each check locally by reading a file, a registry value, a kernel parameter, a service’s start type or the package inventory the other collectors already built. It starts no process. Credential stores and key material are never read, and the evidence it reports never contains file contents. See Custom audits for the format, the deny-list and the limits.
Never collected
- File contents, beyond the version metadata and manifests listed above
- Command lines and environment values other than the paths and variables named above. Both often carry secrets such as
-Ddb.password=…orAWS_SECRET_ACCESS_KEY. They are parsed in memory and discarded. - Password hashes, keys, tokens or certificates
- Application data, logs or database contents
tigergate-agent scan --dry-run --pretty. It prints the full report without contacting TigerGate.