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` |