misp-client

Crates.iomisp-client
lib.rsmisp-client
version0.2.0
created_at2025-12-06 04:40:55.100141+00
updated_at2025-12-06 04:40:55.100141+00
descriptionA Rust client library for MISP threat intelligence platform
homepage
repositoryhttps://github.com/gbrigandi/misp-client-rs
max_upload_size
id1969621
size144,381
Gianluca Brigandi (gbrigandi)

documentation

README

MISP Client

Rust client for the MISP threat intelligence platform API.

Usage

use misp_client::MispClientFactory;

let misp = MispClientFactory::builder()
    .base_url("https://misp.local")
    .api_key("your-api-key")
    .verify_ssl(false)
    .build();

// search attributes
let attrs = misp.attributes().search_by_value("8.8.8.8").await?;

// get event details
let event = misp.events().get("123").await?;

// check warninglists
let on_list = misp.warninglists().is_whitelisted("8.8.8.8").await?;

Clients

MispClientFactory provides access to:

  • events() for event queries
  • attributes() for IOC searches
  • galaxies() for threat actors, MITRE ATT&CK, malware
  • sightings() for observation tracking
  • warninglists() for false positive checks

Example

IOC enrichment with context lookup, sighting history, and warninglist check:

use misp_client::MispClientFactory;
use std::env;

#[tokio::main]
async fn main() -> misp_client::Result<()> {
    let misp = MispClientFactory::builder()
        .base_url(env::var("MISP_URL").expect("MISP_URL required"))
        .api_key(env::var("MISP_API_KEY").expect("MISP_API_KEY required"))
        .verify_ssl(false)
        .build();

    let info = misp.test_connection().await?;
    println!("MISP {}\n", info.version);

    let ioc = "192.168.1.100";
    println!("Lookup: {}", ioc);

    let results = misp.attributes().search_by_value(ioc).await?;

    if results.is_empty() {
        println!("  no matches");
    } else {
        println!("  {} matches:", results.len());
        for attr in &results {
            println!("  Event #{}: {} ({})", attr.event_id, attr.value, attr.attr_type);
        }
    }

    let count = misp.sightings().count_for_value(ioc).await?;
    println!("\nSightings: {} total ({} pos, {} neg)",
        count.total, count.positive, count.negative);

    if misp.warninglists().is_whitelisted(ioc).await? {
        println!("\nOn warninglist");
    } else {
        println!("\nNot on any warninglist");
    }

    Ok(())
}

Run with:

MISP_URL=https://misp.local MISP_API_KEY=xxx cargo run --example enrichment

See examples/ for more.

License

MIT

Commit count: 4

cargo fmt