Sandfly용 Expr 규칙
expr 규칙은 선택한 Sandfly forensic engine이 제공하는 result data object(들)에 접근할 수 있습니다. user engine은 expr 규칙에 "user" object를 제공하고, file engine은 "file" object를 제공합니다 등.
예를 들어 sandfly에서 process recon 결과를 보고 원시 result data에서 {"results": {"process": {"name": "apache"}}} 필드를 확인했다면, 해당 "process" result 구조의 "name" 속성을 참조하여 그 프로세스에 일치하는 expr 규칙을 다음과 같이 작성할 수 있습니다:
process.name == 'apache'여러 값을 포함할 수 있는 배열 형태의 result data 필드의 경우, expr 언어는 all, any, none 등의 함수를 제공하여 원하는 기준을 포함하거나 포함하지 않는 결과를 찾을 수 있습니다:
any(process.network_ports.tcp.connections, {.port_local in [1337,4444,31337]})predicate를 사용하는 또 다른 배열 예시는 다음과 같습니다:
any(user.group_membership, {# == 'sudo'})"추가 연산자 예시
이 섹션에는 실제 sandfly에서 사용되는 추가 규칙 샘플이 포함되어 있습니다. 유사한 기능을 수행하는 sandfly의 규칙을 살펴보는 것은 시작하는 데 효과적입니다.
- 비교: < (미만)
user.password.age_min < 7- 비교: != (같지 않음) + 논리: or
user.uid != 65534 or user.gid != 65534- 멤버십: in + 범위: ..
log.wtmp.date.created_minutes in 1..1440- 멤버십: in + 멤버십: [ ] (배열)
file.username in ['systemd-network','systemd-resolve','systemd-timesync']- 정규식: matches + 논리: not
process.name not matches '(apache.*|nginx.*)'- 문자열: 배열의 어떤 요소라도 startsWith
any(atjob.command, {# startsWith '/dev/shm/'})- 실제 Sandfly에서 가져온 연산자 예시:
log.lastlog.date.created_minutes < 1440 && log.lastlog.username == 'bin'process.network_ports.operating == true and process.cmdline matches '\\\\btwistd.*--path[[:blank:]]*\\\\.'rule_op
"rule_op" 속성은 모든 규칙을 "and" 또는 "or" 논리로 결합할지 여부를 제어합니다. 더 복잡한 논리 중첩이 필요한 경우, 개별 규칙 안에 논리 연산자로 결합된 여러 표현식을 포함할 수 있습니다.
예를 들어 이름이 "oldproc"인 오래된 프로세스 또는 "newproc"인 새로운 프로세스에 일치하는 sandfly를 작성하려면, 다음과 같은 규칙을 사용할 수 있습니다:
{
"rule_op": "or",
"rules": [
"process.name == 'oldproc' && process.date.created_minutes > 1440",
"process.name == 'newproc' && process.date.created_minutes < 1440"
]
}Updated 7 days ago