Files
hiveops-aria/src/main/java/com/hiveops/aria/entity/ThreatIoc.java
T
johannes bdc2504635
CD - Develop / build-and-deploy (push) Failing after 52s
feat(aria): Phase 5 — IOC feed refresh from OTX, MalwareBazaar, ThreatFox
Adds automated daily IOC ingestion from three external threat feeds:
- AlienVault OTX: subscribed pulses + ATM-keyword searches (requires API key)
- MalwareBazaar (abuse.ch): ATM-tagged malware samples, no key required
- ThreatFox (abuse.ch): ATM malware family IOCs, no key required

Backend:
- IocFeedRun entity + V6 Flyway migration (ioc_feed_run table)
- OtxFeedClient / MalwareBazaarFeedClient / ThreatFoxFeedClient
- IocFeedService: upsert dedup + @Scheduled daily 03:00 refresh
- IocFeedController: GET /status, GET /runs, POST /refresh, POST /refresh/{feed}
- ThreatIoc.IocSource enum extended: OTX, MALWARE_BAZAAR, THREAT_FOX

Frontend:
- IocFeeds.svelte: feed status cards, run history table, manual refresh
- App.svelte: IOC Feeds nav item (📡), version string removed from sidebar
- api.ts: getFeedStatus, getFeedRuns, refreshAllFeeds, refreshFeed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:01:09 -04:00

66 lines
1.5 KiB
Java

package com.hiveops.aria.entity;
import jakarta.persistence.*;
import lombok.*;
import java.time.Instant;
@Entity
@Table(name = "threat_ioc")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ThreatIoc {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(name = "ioc_type", nullable = false, columnDefinition = "ioc_type")
private IocType iocType;
@Column(nullable = false)
private String value;
private String description;
@Enumerated(EnumType.STRING)
@Column(nullable = false, columnDefinition = "ioc_source")
@Builder.Default
private IocSource source = IocSource.FBI_FLASH;
@Column(name = "source_ref")
private String sourceRef;
@Enumerated(EnumType.STRING)
@Column(nullable = false, columnDefinition = "confidence_level")
@Builder.Default
private ConfidenceLevel confidence = ConfidenceLevel.HIGH;
@Column(name = "added_at", nullable = false)
@Builder.Default
private Instant addedAt = Instant.now();
@Column(name = "expires_at")
private Instant expiresAt;
@Column(nullable = false)
@Builder.Default
private Boolean active = true;
public enum IocType {
FILENAME, MD5, REGISTRY_KEY, DIRECTORY, SERVICE_NAME, IP, FILE_PATH
}
public enum IocSource {
FBI_FLASH, FS_ISAC, MANUAL, OTX, MALWARE_BAZAAR, THREAT_FOX
}
public enum ConfidenceLevel {
HIGH, MEDIUM, LOW
}
}