dam ======= Denial-of-service Analysis Multitool.
This is a suite of tools to simulate flooding attacks on a P2P network, to verify and fine tune protection mechanisms against them.
A daemon, a command-line client and a localnet script are provided. ## damd Dummy daemon implementing some P2P communication protocols, along with JSON-RPC endpoints to simulate flooding attacks over the network. ## dam-cli Command-line client for `damd`, to trigger flooding attacks and monitor responses. ## dam-localnet Localnet folder with script and configuration to deploy instances to test with. ## Flood testing Here is a table of flooding scenarios to perfor to verify expected behavior, based on configured messages parameters.
| # | Description | Configuration | Outcome | |---|---------------------------------------|----------------|----------------------------------------------------------------------------------------| | 0 | No metering | Default | All flood messages get propagated instantly | | 1 | Same metering everywhere | (0,1,6,500,10) | All flood messages eventually get propagated following rate limit rules | | 2 | `node0` metering, `node1` no metering | (0,1,6,500,10) | node0 disconnects/bans node1 for flooding | | 3 | `node0` no metering, `node1` metering | (0,1,6,500,10) | All flood messages eventually get propagated following rate limit rules | | 4 | Only `Bar` metered | (0,1,6,500,10) | `Foo` messages get propagated instantly while `Bar` messages eventually get propagated | ### Methodology note Message configuration tuple legend: | Pos | Description | |-----|-----------------------------------------| | 0 | MAX_BYTES | | 1 | METERING_SCORE | | 2 | MeteringConfiguration.threshold | | 3 | MeteringConfiguration.sleep_step (ms) | | 4 | MeteringConfiguration.expiry_time (sec) | When different configurations are used between the two nodes, you have to manually compile `damd` with the corresponding message configuration, copy/move/rename the binary and update the localnet script accordingly.
Each message can be configured in their corresponding protocol file.
All paths are relative from this folder. | Message | Path | |---------------|------------------------------------------| | `Bar` | `damd/src/proto/protocol_bar.rs::L49-55` | | `FooRequest` | `damd/src/proto/protocol_foo.rs::L49-55` | | `FooResponse` | `damd/src/proto/protocol_foo.rs::L64-70` |