Skip to content

Latest commit

Β 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

SysSight

What did this process actually do?

SysSight reconstructs Linux process behavior from kernel/system-level events, turning raw activity into a navigable timeline of processes, files, and network connections - instead of a scrolling wall of individual syscalls.

python3
β”œβ”€β”€ opened /tmp/config
β”œβ”€β”€ created network socket
β”œβ”€β”€ connected to 185.x.x.x:443
└── spawned /bin/sh

SysSight doesn't try to tell you "this is malware." It shows you what happened, with evidence, and lets you decide.

A real dashboard, rendered from a real capture

The block below isn't a mockup - it's the actual ratatui dashboard code, rendered through syssight_tui::render_to_text() into an in-memory buffer (no real terminal needed) against a genuine capture recorded from examples/mixed_behavior/run.sh (see crates/syssight-tui/examples/ascii_screenshot.rs; the file behind it ships at docs/sample-capture.ssr). There's no bitmap screenshot or GIF in this repository - generating one needs a graphical/pty recording tool this project's sandboxed development environment didn't have access to

  • so scripts/demo.tape (for VHS) is included for anyone who wants to produce one; run vhs scripts/demo.tape to get docs/demo.gif.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚SysSight β€” replay β€” root pid 917 β€” 24 events                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”ŒProcess Treeβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒTimeline───────────────────────────────────────────────────────┐
β”‚/usr/bin/dash (pid 917)          β”‚β”‚     3058732ns  EXEC     pid=917     sh /usr/bin/dash sh examplβ”‚
β”‚  └─ /usr/bin/python3.12 (pid 920β”‚β”‚     3058732ns  FORK     pid=917     sh child=920              β”‚
β”‚  └─ /usr/bin/sleep (pid 921)    β”‚β”‚     3058732ns  EXEC     pid=920     python3 /usr/bin/python3.1β”‚
β”‚  └─ /usr/bin/python3.12 (pid 923β”‚β”‚     3058732ns  FORK     pid=917     sh child=921              β”‚
β”‚  └─ /usr/bin/dash (pid 924)     β”‚β”‚     3058732ns  EXEC     pid=921     sleep /usr/bin/sleep sleepβ”‚
β”‚    └─ /usr/bin/sleep (pid 925)  β”‚β”‚     3058732ns  OPEN     pid=921     sleep /dev/null           β”‚
β”‚                                 β”‚β”‚     3058732ns  OPEN     pid=917     sh /dev/null              β”‚
β”‚                                 β”‚β”‚     3058732ns  OPEN     pid=917     sh /home/gab/syssight/eβ”‚
β”‚                                 β”‚β”‚    24701086ns  BIND     pid=920     python3 TCP 127.0.0.1:8972β”‚
β”‚                                 β”‚β”‚   317640250ns  FORK     pid=917     sh child=923              β”‚
β”‚                                 β”‚β”‚   317640250ns  EXEC     pid=923     python3 /usr/bin/python3.1β”‚
β”‚                                 β”‚β”‚   317640250ns  OPEN     pid=923     python3 /dev/null         β”‚
β”‚                                 β”‚β”‚   317640250ns  EXIT     pid=921     sleep                     β”‚
β”‚                                 β”‚β”‚   342704086ns  FORK     pid=917     sh child=924              β”‚
β”‚                                 β”‚β”‚   342704086ns  EXEC     pid=924     sh /usr/bin/dash sh -c echβ”‚
β”‚                                 β”‚β”‚   342704086ns  FORK     pid=924     sh child=925              β”‚
β”‚                                 β”‚β”‚   342704086ns  EXEC     pid=925     sleep /usr/bin/sleep sleepβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”ŒNetworkβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒFilesystemβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒEventsβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒIndicators─────────────┐
β”‚1 connections          β”‚β”‚6 files                β”‚β”‚24 events              β”‚β”‚0 indicators           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
q: quit   p: pause/resume   tab: switch pane   j/k or ↑/↓: navigate   /: search                     
```ocess behavior from kernel/system-level
events, turning raw activity into a navigable timeline of processes,
files, and network connections - instead of a scrolling wall of
individual syscalls.

```text
python3
β”œβ”€β”€ opened /tmp/config
β”œβ”€β”€ created network socket
β”œβ”€β”€ connected to 185.x.x.x:443
└── spawned /bin/sh

SysSight doesn't try to tell you "this is malware." It shows you what happened, with evidence, and lets you decide.

A real dashboard, rendered from a real capture

The block below isn't a mockup - it's the actual ratatui dashboard code, rendered through syssight_tui::render_to_text() into an in-memory buffer (no real terminal needed) against a genuine capture recorded from examples/mixed_behavior/run.sh (see crates/syssight-tui/examples/ascii_screenshot.rs; the file behind it ships at docs/sample-capture.ssr). There's no bitmap screenshot or GIF in this repository - generating one needs a graphical/pty recording tool this project's sandboxed development environment didn't have access to

  • so scripts/demo.tape (for VHS) is included for anyone who wants to produce one; run vhs scripts/demo.tape to get docs/demo.gif.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚SysSight β€” replay β€” root pid 1057 β€” 23 events                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”ŒProcess Treeβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒTimeline───────────────────────────────────────────────────────┐
β”‚/usr/bin/sleep (pid 1061)        β”‚β”‚      112830ns  EXEC     pid=1061    sleep /usr/bin/sleep sleepβ”‚
β”‚/usr/bin/dash (pid 1057)         β”‚β”‚      112830ns  EXEC     pid=1057    sh /usr/bin/dash sh examplβ”‚
β”‚  └─ /usr/bin/python3.12 (pid 106β”‚β”‚      112830ns  FORK     pid=1057    sh child=1060             β”‚
β”‚  └─ /usr/bin/python3.12 (pid 106β”‚β”‚      112830ns  EXEC     pid=1060    python3 /usr/bin/python3.1β”‚
β”‚  └─ /usr/bin/dash (pid 1065)    β”‚β”‚      112830ns  BIND     pid=1060    python3 TCP 127.0.0.1:8972β”‚
β”‚    └─ /usr/bin/sleep (pid 1066) β”‚β”‚      112830ns  OPEN     pid=1057    sh /dev/null              β”‚
β”‚                                 β”‚β”‚      112830ns  OPEN     pid=1057    sh /home/gab/syssight/eβ”‚
β”‚                                 β”‚β”‚      112830ns  OPEN     pid=1061    sleep /dev/null           β”‚
β”‚                                 β”‚β”‚   213639852ns  FORK     pid=1057    sh child=1064             β”‚
β”‚                                 β”‚β”‚   213639852ns  EXEC     pid=1064    python3 /usr/bin/python3.1β”‚
β”‚                                 β”‚β”‚   213639852ns  OPEN     pid=1064    python3 /dev/null         β”‚
β”‚                                 β”‚β”‚   213639852ns  EXIT     pid=1061    sleep                     β”‚
β”‚                                 β”‚β”‚   257248744ns  FORK     pid=1057    sh child=1065             β”‚
β”‚                                 β”‚β”‚   257248744ns  EXEC     pid=1065    sh /usr/bin/dash sh -c echβ”‚
β”‚                                 β”‚β”‚   257248744ns  FORK     pid=1065    sh child=1066             β”‚
β”‚                                 β”‚β”‚   257248744ns  EXEC     pid=1066    sleep /usr/bin/sleep sleepβ”‚
β”‚                                 β”‚β”‚   257248744ns  OPEN     pid=1066    sleep /dev/null           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”ŒNetworkβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒFilesystemβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒEventsβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒIndicators─────────────┐
β”‚1 connections          β”‚β”‚6 files                β”‚β”‚23 events              β”‚β”‚0 indicators           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
q: quit   p: pause/resume   tab: switch pane   j/k or ↑/↓: navigate   /: search                     
```ocess behavior from kernel/system-level
events, turning raw activity into a navigable timeline of processes,
files, and network connections - instead of a scrolling wall of
individual syscalls.

```text
python3
β”œβ”€β”€ opened /tmp/config
β”œβ”€β”€ created network socket
β”œβ”€β”€ connected to 185.x.x.x:443
└── spawned /bin/sh

SysSight doesn't try to tell you "this is malware." It shows you what happened, with evidence, and lets you decide.

A real dashboard, rendered from a real capture

The block below isn't a mockup - it's the actual ratatui dashboard code, rendered through syssight_tui::render_to_text() into an in-memory buffer (no real terminal needed) against a genuine capture recorded from examples/mixed_behavior/run.sh (see crates/syssight-tui/examples/ascii_screenshot.rs; the file behind it ships at docs/sample-capture.ssr). There's no bitmap screenshot or GIF in this repository - generating one needs a graphical/pty recording tool this project's sandboxed development environment didn't have access to

  • so scripts/demo.tape (for VHS) is included for anyone who wants to produce one; run vhs scripts/demo.tape to get docs/demo.gif.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚SysSight β€” replay β€” root pid 482 β€” 22 events                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”ŒProcess Treeβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒTimeline───────────────────────────────────────────────────────┐
β”‚/usr/bin/python3.12 (pid 485)    β”‚β”‚      106362ns  EXEC     pid=485     python3 /usr/bin/python3.1β”‚
β”‚/usr/bin/sleep (pid 486)         β”‚β”‚      106362ns  EXEC     pid=486     sleep /usr/bin/sleep sleepβ”‚
β”‚/usr/bin/dash (pid 482)          β”‚β”‚      106362ns  EXEC     pid=482     run.sh /usr/bin/dash /bin/β”‚
β”‚  └─ /usr/bin/python3.12 (pid 489β”‚β”‚      106362ns  BIND     pid=485     python3 TCP 127.0.0.1:8972β”‚
β”‚  └─ /usr/bin/dash (pid 490)     β”‚β”‚      106362ns  OPEN     pid=486     sleep /dev/null           β”‚
β”‚    └─ /usr/bin/sleep (pid 491)  β”‚β”‚      106362ns  OPEN     pid=482     run.sh /dev/null          β”‚
β”‚                                 β”‚β”‚      106362ns  OPEN     pid=482     run.sh /home/gab/syssigβ”‚
β”‚                                 β”‚β”‚   207591112ns  FORK     pid=482     run.sh child=489          β”‚
β”‚                                 β”‚β”‚   207591112ns  EXEC     pid=489     python3 /usr/bin/python3.1β”‚
β”‚                                 β”‚β”‚   207591112ns  OPEN     pid=489     python3 /dev/null         β”‚
β”‚                                 β”‚β”‚   207591112ns  EXIT     pid=486     sleep                     β”‚
β”‚                                 β”‚β”‚   253478733ns  FORK     pid=482     run.sh child=490          β”‚
β”‚                                 β”‚β”‚   253478733ns  EXEC     pid=490     sh /usr/bin/dash sh -c echβ”‚
β”‚                                 β”‚β”‚   253478733ns  FORK     pid=490     sh child=491              β”‚
β”‚                                 β”‚β”‚   253478733ns  EXEC     pid=491     sleep /usr/bin/sleep sleepβ”‚
β”‚                                 β”‚β”‚   253478733ns  OPEN     pid=491     sleep /dev/null           β”‚
β”‚                                 β”‚β”‚   253478733ns  OPEN     pid=490     sh /dev/null              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”ŒNetworkβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒFilesystemβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒEventsβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”ŒIndicators─────────────┐
β”‚1 connections          β”‚β”‚6 files                β”‚β”‚22 events              β”‚β”‚0 indicators           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
q: quit   p: pause/resume   tab: switch pane   j/k or ↑/↓: navigate   /: search                     

Why

Tools like strace show you every syscall with none of the narrative. Tools like Falco/Tracee/Tetragon are built for fleet-wide policy enforcement, not for answering "what did this one process do" in a way you can navigate and replay later. SysSight is scoped narrowly: one process tree, correlated into a tree/timeline, saved to a compact capture format you can hand to someone else or look at tomorrow. See docs/architecture/ebpf.md for the actual prior-art research this claim is based on, not just an assertion.

Status

1.0.2. See docs/development/stability-policy.md for exactly what this version commits to - short version: the procfs-based tool (CLI, .ssr format, correlation engine, TUI) is stable and has 50 passing tests, including a new adversarial-input suite that found and fixed two real, security-relevant bugs before release (see CHANGELOG.md). The experimental CO-RE eBPF backend is still designed but explicitly not built or verified - that hasn't changed with this release; see Limitations and LIMITATIONS.md.

Install / quickstart

git clone https://github.com/gabryxdev/SysSight.git
cd syssight
cargo build --release
sh examples/mixed_behavior/run.sh &
sudo ./target/release/syssight monitor --pid $!

Full walkthrough with real, captured output: docs/guides/quickstart.md (including a note on "Permission denied" running the example scripts - a real distribution-channel gotcha, not hypothetical). Platform-specific install steps: docs/guides/installation.md. Or just run sh scripts/install.sh (builds, then asks before copying anywhere - never uses sudo itself).

Architecture

flowchart TD
    K[Linux kernel] -->|"/proc reads (default)"| CAP[syssight-capture]
    K -.->|"CO-RE eBPF (experimental, unverified)"| CAP
    CAP --> CORE[syssight-core: sessions]
    CORE --> CORR[syssight-correlation: process tree + indicators]
    CORE --> FMT[syssight-format: .ssr read/write]
    CORR --> TUI[syssight-tui]
    CORR --> CLI[syssight-cli: inspect / --no-tui]
    FMT -->|record| DISK[(capture.ssr)]
    DISK -->|replay| FMT
Loading

Full breakdown of each crate and why the boundaries are drawn where they are: docs/architecture/overview.md.

Features

  • Process monitoring: pid/ppid/tid/uid/gid, executable, command line, exec transitions, fork/exit, full process tree.
  • Filesystem activity: open, create, write, delete*, rename*, permission changes* (*modeled in the data format and correlation engine; not yet observable by the default polling backend - see Limitations).
  • Network activity: socket creation, TCP connect/bind, IPv4 and IPv6, correlated to the owning process via /proc/net + fd inode matching.
  • Behavior correlation engine: process tree / event graph linking processes to the files and sockets they touched - see docs/architecture/correlation.md.
  • Rule-based indicators, not AI: three explicit, evidence-producing rules (shell_spawned_by_interpreter, write_then_execute, connect_then_spawn). No LLMs, no ML, no "93% malicious" scores - every indicator ships with the exact pids/paths/timestamps that triggered it.
  • .ssr capture format: a real, versioned, checksummed binary format - not JSON with a different extension. Record now, analyze later, on a different machine, without the process still running. See docs/format/ssr-format.md.
  • Terminal UI: ratatui-based, process tree + timeline + network/filesystem/indicator summary, keyboard navigation, search, pause/resume - shared between live monitoring and replay via a single DataSource trait.
  • --no-tui / --format json on every relevant command, for scripting.

Example usage

# Watch a process live
syssight monitor --pid 4312

# Record for later analysis
syssight record --pid 4312 --output capture.ssr --duration-secs 30

# Look at it later, no process required
syssight replay capture.ssr
syssight inspect capture.ssr --format json

# Check what SysSight needs on this host
syssight doctor

examples/ has four self-contained demo scripts (process_tree, filesystem_activity, network_activity, mixed_behavior) that generate real, harmless observable activity so you can try SysSight immediately - see docs/guides/quickstart.md.

Benchmarks (real, measured, not invented)

cargo run --release -p syssight-benches --bin format-bench
cargo run --release -p syssight-benches --bin correlation-bench

Actual output from one run on the machine this repository was built on:

syssight-format bench (N = 200000 events)
  encode+write:    55.93ms  (   3576020 events/sec)
  parse+decode:    27.74ms  (   7210113 events/sec)
  capture size: 9400431 bytes (47.0 bytes/event)

syssight-correlation bench (2000 processes x 50 events = 102000 events)
  ingest:      56.12ms  (   1817635 events/sec)

Single-run wall-clock numbers on one VM, not a rigorous statistical benchmark - see docs/development/testing.md#benchmarks for the full caveats. Re-run them yourself before relying on the exact figures for anything.

Limitations

Full, current list: LIMITATIONS.md. Summary:

  • The CO-RE eBPF backend is a researched design (docs/architecture/ebpf.md) that has never been built or run against a kernel - this project's sandbox had no root/CAP_BPF. The default /proc-polling backend is what's actually implemented, tested, and used by every command.
  • The polling backend can miss activity that starts and ends between two polls (default 200ms), and doesn't observe file deletes/renames at all
    • both are inherent to polling /proc rather than in-kernel tracing, not bugs.
  • syssight-common and syssight-tui don't have dedicated unit tests of their own yet (syssight-tui is exercised by a render_to_text screenshot example and manual use instead) - every other crate does, including syssight-core and syssight-cli, both newly covered in 1.0.0 (50 tests total: cargo test --workspace).
  • The new fuzz-lite .ssr parser test suite is real and found two genuine bugs before release, but it's a fixed-seed stable-Rust suite, not a coverage-guided cargo-fuzz target - see docs/development/stability-policy.md.

Security considerations

The default backend needs no special privileges to monitor your own processes; monitoring another user's process needs root. SysSight never executes anything derived from monitored-process data, never modifies or signals a monitored process, and never sends captured data anywhere except the .ssr file path you gave it. Full detail, including how .ssr parsing defends against malformed/malicious input: docs/architecture/security-model.md. Found a security issue? See SECURITY.md, not a public issue.

Roadmap

ROADMAP.md - Completed / In Progress / Planned / Future, kept honest (nothing is marked done that wasn't actually built and tested).

Documentation

Contributing

See CONTRIBUTING.md and CODE_OF_CONDUCT.md. Honesty about what's implemented vs. designed vs. planned is treated as a hard requirement for contributions, not a style preference - see CONTRIBUTING.md's "Honesty is a hard requirement" section.

License

Apache License 2.0 - see LICENSE. All direct dependencies (clap, ratatui, crossterm, serde, serde_json, thiserror, anyhow, crc32fast, tempfile, libc) are MIT and/or Apache-2.0 licensed, compatible with this project's license.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages