Detection rules › Elastic
Timestomping Detected via Touch
This rule detects the use of the touch command to modify file timestamps. Attackers may use timestomping to manipulate file timestamps to evade detection and alter the file's appearance. For example, attackers may change the file's creation, modification, and access times to hide malicious activities or make the file appear legitimate.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Stealth |
Rule body
[rule]
description = """
This rule detects the use of the `touch` command to modify file timestamps. Attackers may use timestomping to manipulate
file timestamps to evade detection and alter the file's appearance. For example, attackers may change the file's
creation, modification, and access times to hide malicious activities or make the file appear legitimate.
"""
id = "8012a863-8c0c-4461-bb88-b0193dfb9f38"
license = "Elastic License v2"
name = "Timestomping Detected via Touch"
os_list = ["linux"]
version = "1.0.21"
query = '''
process where event.type == "start" and event.action == "exec" and process.name == "touch" and
process.parent.executable != null and process.args like (
"-t*", "-d*", "-a*", "-m*", "-r*", "--date=*", "--reference=*", "--time=*"
) and process.args like (
"/etc/*", "/bin/*", "/usr/bin/*", "/sbin/*", "/usr/sbin/*", "/opt/*", "/dev/shm/*",
"/var/tmp/*", "/boot/*", "/root/*", "/usr/lib*", "/lib*"
) and not (
process.parent.executable in (
"/usr/local/bin/manage_omnimesh_logs", "/pro/bin/sys/install/packageUtils.sh", "/bin/dracut",
"/usr/libexec/postfix/aliasesdb", "pwsh-preview", "/usr/bin/dracut", "/usr/share/initramfs-tools/hooks/amd64_microcode",
"/usr/local/bin/start-mailserver.sh", "/usr/bin/ssm-agent-worker", "/bin/ssm-agent-worker", "/usr/local/cpanel/scripts/restartsrv_bind",
"/usr/bin/vmtoolsd", "/usr/local/cpanel/bin/restartsrv_base", "/usr/lib/pcp/bin/pmie_check"
) or
process.parent.executable like (
"/opt/sw/tomcat/rc_scripts/*", "/tmp/newroot/var/lib/docker/overlay2/*", "/snap/*", "/opt/zeek/*", "/home/*/bin/ndex-rm.sh",
"/root/.cache/act/*/staging_dir/host/bin/bash"
) or
process.parent.name in (
"xargs", "find", "sudo", "make", "pmlogger_check", "pmlogger_daily", "pmlogger_janitor", "autoupdate", "pmlogctl",
"spyglass", "desktop-launch", "pmiectl"
) or
process.parent.args like (
"/home/*/scripts/auto_download_process.py", "/home/*/scripts/perl_python_eagu1p.py", "/var/lib/dpkg/info/*",
"bazel-out/k8-dbg/bin/dependencies/thirdparty/libjansson_foreign_cc/build_script.sh", "/usr/lib/portage/python*/ebuild.sh",
"/var/tmp/rpm-tmp.*", "/usr/lib/pcp/bin/pmlogger_janitor", "/usr/libexec/pcp/bin/pmlogger_janitor",
"/usr/libexec/pcp/bin/pmlogger_daily", "/usr/lib/pcp/bin/pmlogger_daily", "/opt/oracle.ExaWatcher/GetExaWatcherResults.sh",
"bazel-out/k8-dbg/bin/external/libzip+/libzip_foreign_cc/build_script.sh", "/builds/*/IP/embedded/platforms/stratawave-yocto/build/*/temp/run.sstate_unpack_package*",
"/usr/local/bin/manage_omnimesh_logs"
) or
process.args in (
"/usr/bin/coreutils", "--no-create", "/etc/opt/lumu/lumud.conf", "/opt/vuso*", "/opt/diff", "/etc/aliases.db", "/opt/cursor/cursor"
) or
process.args like (
"--checkpoint=*", "/root/.config/envman/*", "/var/tmp/dracut*", "/var/tmp/portage*", "/snap/*", "/var/tmp/pmlogger_*/stamp",
"/opt/ubki/*.jar", "/root/.cache/bazel/_bazel_root/*", "/root/.cache/act/*/hostexecutor/matrix/*/tmp/*.o",
"/opt/ubki/*/cassandra-repair-dev-test/*"
) or
process.command_line in (
"/bin/touch -a /tmp/au_status", "touch -d 2 seconds ago /etc/postfix/main.cf", "touch -a /etc/apt/client.key /etc/apt/client.crt",
"touch -r /etc/aliases.lmdb /var/lib/misc/postfix.aliasesdb-stamp"
) or
process.parent.command_line == "runc init" or
process.working_directory in ("/opt/libexec", "/opt/local/src/connectxx/build/src/mdp") or
(process.args like "/var/tmp/pmlogger_check.*/_stamp" and process.parent.args == "/usr/libexec/pcp/bin/pmlogger_check" )
)
'''
min_endpoint_version = "7.15.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0
[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 0
[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1070"
name = "Indicator Removal"
reference = "https://attack.mitre.org/techniques/T1070/"
[[threat.technique.subtechnique]]
id = "T1070.006"
name = "Timestomp"
reference = "https://attack.mitre.org/techniques/T1070/006/"
[threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"
[internal]
min_endpoint_version = "7.15.0"
Stages and Predicates
Stage 1: process
process where event.type == "start" and event.action == "exec" and process.name == "touch" and
process.parent.executable != null and process.args like (
"-t*", "-d*", "-a*", "-m*", "-r*", "--date=*", "--reference=*", "--time=*"
) and process.args like (
"/etc/*", "/bin/*", "/usr/bin/*", "/sbin/*", "/usr/sbin/*", "/opt/*", "/dev/shm/*",
"/var/tmp/*", "/boot/*", "/root/*", "/usr/lib*", "/lib*"
) and not (
process.parent.executable in (
"/usr/local/bin/manage_omnimesh_logs", "/pro/bin/sys/install/packageUtils.sh", "/bin/dracut",
"/usr/libexec/postfix/aliasesdb", "pwsh-preview", "/usr/bin/dracut", "/usr/share/initramfs-tools/hooks/amd64_microcode",
"/usr/local/bin/start-mailserver.sh", "/usr/bin/ssm-agent-worker", "/bin/ssm-agent-worker", "/usr/local/cpanel/scripts/restartsrv_bind",
"/usr/bin/vmtoolsd", "/usr/local/cpanel/bin/restartsrv_base", "/usr/lib/pcp/bin/pmie_check"
) or
process.parent.executable like (
"/opt/sw/tomcat/rc_scripts/*", "/tmp/newroot/var/lib/docker/overlay2/*", "/snap/*", "/opt/zeek/*", "/home/*/bin/ndex-rm.sh",
"/root/.cache/act/*/staging_dir/host/bin/bash"
) or
process.parent.name in (
"xargs", "find", "sudo", "make", "pmlogger_check", "pmlogger_daily", "pmlogger_janitor", "autoupdate", "pmlogctl",
"spyglass", "desktop-launch", "pmiectl"
) or
process.parent.args like (
"/home/*/scripts/auto_download_process.py", "/home/*/scripts/perl_python_eagu1p.py", "/var/lib/dpkg/info/*",
"bazel-out/k8-dbg/bin/dependencies/thirdparty/libjansson_foreign_cc/build_script.sh", "/usr/lib/portage/python*/ebuild.sh",
"/var/tmp/rpm-tmp.*", "/usr/lib/pcp/bin/pmlogger_janitor", "/usr/libexec/pcp/bin/pmlogger_janitor",
"/usr/libexec/pcp/bin/pmlogger_daily", "/usr/lib/pcp/bin/pmlogger_daily", "/opt/oracle.ExaWatcher/GetExaWatcherResults.sh",
"bazel-out/k8-dbg/bin/external/libzip+/libzip_foreign_cc/build_script.sh", "/builds/*/IP/embedded/platforms/stratawave-yocto/build/*/temp/run.sstate_unpack_package*",
"/usr/local/bin/manage_omnimesh_logs"
) or
process.args in (
"/usr/bin/coreutils", "--no-create", "/etc/opt/lumu/lumud.conf", "/opt/vuso*", "/opt/diff", "/etc/aliases.db", "/opt/cursor/cursor"
) or
process.args like (
"--checkpoint=*", "/root/.config/envman/*", "/var/tmp/dracut*", "/var/tmp/portage*", "/snap/*", "/var/tmp/pmlogger_*/stamp",
"/opt/ubki/*.jar", "/root/.cache/bazel/_bazel_root/*", "/root/.cache/act/*/hostexecutor/matrix/*/tmp/*.o",
"/opt/ubki/*/cassandra-repair-dev-test/*"
) or
process.command_line in (
"/bin/touch -a /tmp/au_status", "touch -d 2 seconds ago /etc/postfix/main.cf", "touch -a /etc/apt/client.key /etc/apt/client.crt",
"touch -r /etc/aliases.lmdb /var/lib/misc/postfix.aliasesdb-stamp"
) or
process.parent.command_line == "runc init" or
process.working_directory in ("/opt/libexec", "/opt/local/src/connectxx/build/src/mdp") or
(process.args like "/var/tmp/pmlogger_check.*/_stamp" and process.parent.args == "/usr/libexec/pcp/bin/pmlogger_check" )
)
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process.args | wildcard | /var/tmp/pmlogger_check.*/_stamp | excludes:process.args field:"process.args" value:"/var/tmp/pmlogger_check.*/_stamp" |
process.parent.args | eq | /usr/libexec/pcp/bin/pmlogger_check | excludes:process.parent.args field:"process.parent.args" value:"/usr/libexec/pcp/bin/pmlogger_check" |
process.args | in | --no-create, /etc/aliases.db, /etc/opt/lumu/lumud.conf, /opt/cursor/cursor, /opt/diff, /opt/vuso*, /usr/bin/coreutils | excludes:process.args |
process.args | wildcard | --checkpoint=*, /root/.config/envman/*, /var/tmp/dracut*, /var/tmp/portage*, /snap/*, /var/tmp/pmlogger_*/stamp, /opt/ubki/*.jar, /root/.cache/bazel/_bazel_root/*, /root/.cache/act/*/hostexecutor/matrix/*/tmp/*.o, /opt/ubki/*/cassandra-repair-dev-test/* | excludes:process.args |
process.command_line | in | /bin/touch -a /tmp/au_status, touch -a /etc/apt/client.key /etc/apt/client.crt, touch -d 2 seconds ago /etc/postfix/main.cf, touch -r /etc/aliases.lmdb /var/lib/misc/postfix.aliasesdb-stamp | excludes:process.command_line |
process.parent.args | wildcard | /home/*/scripts/auto_download_process.py, /home/*/scripts/perl_python_eagu1p.py, /var/lib/dpkg/info/*, bazel-out/k8-dbg/bin/dependencies/thirdparty/libjansson_foreign_cc/build_script.sh, /usr/lib/portage/python*/ebuild.sh, /var/tmp/rpm-tmp.*, /usr/lib/pcp/bin/pmlogger_janitor, /usr/libexec/pcp/bin/pmlogger_janitor, /usr/libexec/pcp/bin/pmlogger_daily, /usr/lib/pcp/bin/pmlogger_daily, /opt/oracle.ExaWatcher/GetExaWatcherResults.sh, bazel-out/k8-dbg/bin/external/libzip+/libzip_foreign_cc/build_script.sh, /builds/*/IP/embedded/platforms/stratawave-yocto/build/*/temp/run.sstate_unpack_package*, /usr/local/bin/manage_omnimesh_logs | excludes:process.parent.args |
process.parent.command_line | eq | runc init | excludes:process.parent.command_line field:"process.parent.command_line" value:"runc init" |
process.parent.executable | in | /bin/dracut, /bin/ssm-agent-worker, /pro/bin/sys/install/packageUtils.sh, /usr/bin/dracut, /usr/bin/ssm-agent-worker, /usr/bin/vmtoolsd, /usr/lib/pcp/bin/pmie_check, /usr/libexec/postfix/aliasesdb, /usr/local/bin/manage_omnimesh_logs, /usr/local/bin/start-mailserver.sh, /usr/local/cpanel/bin/restartsrv_base, /usr/local/cpanel/scripts/restartsrv_bind, /usr/share/initramfs-tools/hooks/amd64_microcode, pwsh-preview | excludes:process.parent.executable |
process.parent.executable | wildcard | /opt/sw/tomcat/rc_scripts/*, /tmp/newroot/var/lib/docker/overlay2/*, /snap/*, /opt/zeek/*, /home/*/bin/ndex-rm.sh, /root/.cache/act/*/staging_dir/host/bin/bash | excludes:process.parent.executable |
process.parent.name | in | autoupdate, desktop-launch, find, make, pmiectl, pmlogctl, pmlogger_check, pmlogger_daily, pmlogger_janitor, spyglass, sudo, xargs | excludes:process.parent.name |
process.working_directory | in | /opt/libexec, /opt/local/src/connectxx/build/src/mdp | excludes:process.working_directory field:"process.working_directory" value:"/opt/libexec" field:"process.working_directory" value:"/opt/local/src/connectxx/build/src/mdp" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
event.action | eq |
| field:"EventType" kind:eq value:"exec" |
event.type | eq |
| field:"event.type" kind:eq value:"start" |
process.args | wildcard |
| field:"process.args" kind:wildcard |
process.name | eq |
| field:"process_name" kind:eq value:"touch" |
process.parent.executable | is_not_null | field:"ParentImage" kind:is_not_null |