Commit Graph
884 Commits
Author SHA1 Message Date
dextmorgn dd9caf2cb1 fix(api): enforce object-level authorization on Flow update/delete/read
Flow update, delete, and ID-based read never checked caller identity
against the target record, so any authenticated user could tamper with
or delete another user's Flow by UUID, and the list endpoint returned
every user's flows unfiltered. Added a nullable owner_id column (NULL
= pre-existing flows, readable by all but not editable via the API),
stamp it on create, and check ownership in FlowService before mutating
or returning a single Flow.

Fixes GHSA-qvx2-6v5v-wwrg.
2026-08-23 13:10:11 +02:00
dextmorgnandGitHub d758bc8632 Merge pull request #210 from Yvanss971/fix/neo4j-healthcheck
fix: increase Celery healthcheck timeout
2026-08-23 09:54:58 +02:00
Yvanss971 7d1f8a4666 fix: increase Celery healthcheck timeout 2026-08-11 12:22:26 -04:00
dextmorgnandGitHub 616516b20f Merge pull request #209 from Yvanss971/fix/neo4j-healthcheck
fix: increase Neo4j healthcheck timeout
2026-08-11 14:06:57 +02:00
Yvanss971 7ea453ad5f fix: increase Neo4j healthcheck timeout 2026-08-10 22:08:38 -04:00
dextmorgnandGitHub 10137b984d Merge pull request #208 from reconurge/fix/nginx-conf-selinux-mount
fix(docker): relabel nginx.conf bind mount for SELinux hosts
2026-08-10 17:31:24 +02:00
dextmorgn 9554fb4e9b fix(docker): relabel nginx.conf bind mount for SELinux hosts
Container couldn't open /etc/nginx/nginx.conf (permission denied) on
SELinux-enforcing hosts (e.g. Fedora Kinoite) because the bind-mounted
file kept its host label. Add :Z to relabel it for container-only
access; no-op on hosts without SELinux.

Fixes #207
2026-08-10 17:28:21 +02:00
dextmorgnandGitHub 43f1f6c450 Merge pull request #205 from Ghraven/fix/navbar-external-link-rel
Harden navbar external links
2026-08-05 11:24:54 +02:00
Ghraven 7f81ab499e Harden navbar external links 2026-08-04 11:20:13 +08:00
dextmorgnandGitHub 95e0ab91cb Merge pull request #200 from Topman3579/fix/dnsx-stdin-and-scamalytics-host
fix(enrichers): dnsx stdin input + configurable Scamalytics API host
2026-07-28 09:39:57 +02:00
dextmorgnandGitHub a90e5e0bff Merge pull request #199 from Ghraven/fix/scan-started-at-aware-utc
Use timezone-aware Scan start defaults
2026-07-28 09:38:28 +02:00
Topman3579 ebda0f4c49 fix(enrichers): dnsx stdin input + configurable Scamalytics API host
Two enrichers silently return empty results instead of failing loudly.

1. domain_to_dns
   dnsx >= 1.2 treats -d as "bruteforce this domain" and exits with
   "missing wordlist(w) flag required with domain(d) input" unless -w is
   also given, so `dnsx -d example.com -a -aaaa -json -silent` never
   produces output. The enricher catches nothing (the tool exits 0) and
   returns [], while Celery still reports the task as succeeded.
   Feed the single target on stdin instead, which is the supported
   single-target invocation. DockerTool.launch() gains an optional
   entrypoint override so a shell can be put in front of the image
   entrypoint; the domain is passed through shlex.quote().

2. ip_to_fraudscore
   Scamalytics assigns each account a numbered API node (api11, api12,
   ...) and the host was hardcoded to api12, which returns 404 for every
   account provisioned on a different node. The host is now read from a
   SCAMLYTICS_API_HOST secret/env var, defaulting to the previous api12
   so existing deployments are unaffected.

Verified against dnsx v1.2.2 and a live Scamalytics v3 account.
2026-07-27 14:29:02 +07:00
Ghraven 0a47d8b625 Use timezone-aware Scan start defaults 2026-07-25 00:30:50 +08:00
dextmorgnandGitHub 0d092c44f0 Merge pull request #191 from Ghraven/fix/fraudscore-aware-utc
fix: use aware timestamp for fraud score updates
v1.2.11
2026-07-01 10:50:59 +02:00
dextmorgnandGitHub e02d548578 Merge pull request #193 from Ghraven/fix/core-aware-utc-cutoffs
fix(core): use aware UTC timestamps
2026-06-24 09:29:32 +02:00
Ghraven d049cb1e3e fix(core): use aware UTC timestamps 2026-06-24 15:03:31 +08:00
dextmorgnandGitHub db4ab1b5ca Merge pull request #178 from aaronjmars/security/host-header-allowlist-dns-rebinding
fix(security): Host-header allowlist + restore dropped security headers
2026-06-22 17:10:22 +02:00
dextmorgn 0c5a6bfabc fix(tools): align test fixtures with current GraphNode shape
Also fix root .gitignore accidentally shadowing flowsint-app/src/lib/
via Python venv lib/ rule — add negation to unblock tracking.
2026-06-21 16:58:21 +02:00
dextmorgn c84b96cced chore(husky): remove deprecated shell shim from commit-msg hook 2026-06-21 16:40:57 +02:00
dextmorgn 1f57cb0904 fix(security): bump dompurify and cryptography to patched versions
- dompurify 3.3.0 → 3.4.11 (XSS bypass CVEs via tiptap)
- cryptography 46.0.7 → 48.0.1 (vulnerable OpenSSL in wheels)
2026-06-21 16:39:21 +02:00
dextmorgn 65c7ba2c01 style(vault): simplify empty state and keys table UI
Replace over-designed empty state (gradient card, badge row, clip-text)
with plain centered layout matching app empty-state pattern.
Strip table of gradient hovers, animated icon boxes, and decorative
clock pills — plain rows, plain header.
2026-06-21 16:27:13 +02:00
dextmorgn f06989447e fix(graph): wrap clip in save/restore to prevent canvas state leak
ctx.clip() without save/restore was permanently mutating the clipping
region across all subsequent canvas draw calls, causing uncontrollable
scaling on nodes and background when a node had an imageUrl.
2026-06-21 16:13:23 +02:00
dextmorgn 2a378954ae fix(types): make username not required for SocialAccount 2026-06-21 16:02:21 +02:00
Ghraven 0485fc1746 fix: use aware timestamp for fraud score updates 2026-06-21 19:38:07 +08:00
dextmorgnandGitHub ee66f8e0fc Merge pull request #182 from rachit367/feat/domain-to-dns-enricher
feat(enrichers): add domain_to_dns enricher using dnsx
2026-06-20 18:03:09 +02:00
dextmorgnandGitHub 7ea36bb9af Merge pull request #183 from rachit367/feat/technology-type-and-tech-detect
feat(types,enrichers): add Technology type and tech_detect transformer
2026-06-20 17:57:53 +02:00
dextmorgnandGitHub 9218948b35 Merge pull request #181 from zurtix/main
feat(custom types): added category to custom types for organization
2026-06-20 17:54:26 +02:00
dextmorgnandGitHub 48d1df13d6 Merge pull request #185 from rachit367/feat/detect-file-hashes
feat(types): detect MD5/SHA1/SHA256 file hashes on import
2026-06-20 17:50:13 +02:00
dextmorgn fe8a4a3210 fix: make nginx resolver Podman-compatible
Remove Docker-specific resolver (127.0.0.11) in favor of direct
proxy_pass, which falls back to the system resolver (/etc/resolv.conf).
Mount local nginx.conf into the prod image to override the baked-in config.
2026-06-20 17:44:57 +02:00
dextmorgnandGitHub ddc943790b Merge pull request #187 from localzet/main
fix: "exec /docker-entrypoint.sh: exec format error" in flowsint-app
2026-06-18 08:49:08 +02:00
dextmorgnandGitHub 80969367e6 Merge pull request #189 from Ghraven/feat/export-selected-json
feat: export selected graph nodes as JSON
2026-06-18 08:45:40 +02:00
dextmorgnandGitHub 67c7c4a833 Merge pull request #190 from Ghraven/fix/yaml-loader-utf8
fix: read YAML templates as UTF-8
2026-06-18 08:44:27 +02:00
Ghraven 38c7a72cb1 fix: read YAML templates as UTF-8 2026-06-13 22:47:15 +08:00
Ghraven cf2bc1ec07 feat: export selected graph nodes as JSON 2026-06-12 04:24:00 +08:00
dextmorgnandGitHub 3885f8b4d1 Merge pull request #188 from Ghraven/fix/remove-frontend-debug-logs
fix(ui): remove frontend debug console logs
2026-06-11 12:37:11 +02:00
Ghraven 8de27796b0 fix(ui): remove frontend debug console logs 2026-06-11 13:55:17 +08:00
Ivan Zorin eedbeb4013 chore: update nginx base image to version 1.29-alpine 2026-06-09 14:05:54 +03:00
rachit367 2e12e42bba feat(types): detect MD5/SHA1/SHA256 file hashes on import
TXT imports of file hashes were detected as Username, because File.detect
always returned False and Username.detect matches any 3-80 char
alphanumeric string. Hashes therefore couldn't be used as File entities
to pivot from (VirusTotal, MalwareBazaar, sandboxes), per #45.

- File.detect now recognizes 32/40/64-char hex strings (MD5/SHA1/SHA256),
  and File.from_string stores the value in the matching hash_* field
  (normalized to lowercase) while keeping it as the filename/label.
- Username.detect now explicitly rejects hash-shaped strings, so hash
  detection is correct regardless of type-registration order (File is
  already registered before Username, but this removes the implicit
  dependency).

Tests cover detection of each hash type (case/whitespace), rejection of
non-hashes, from_string field population, the Username regression, and
end-to-end detect_type() resolution to File.

Closes #45
2026-06-09 11:30:37 +05:30
rachit367 63a97a76f7 feat(types,enrichers): add Technology type and tech_detect transformer
Adds application-level technology fingerprinting, extending coverage
beyond ip/port/website/ssl_certificate as requested in #59.

- New `Technology` type (name, version, category, source) registered in
  the type registry, the package exports, and TYPE_TO_MODEL. Its
  from_string accepts both bare names ("nginx") and wappalyzer-style
  "name:version" pairs ("PHP:8.1").
- New `tech_detect` enricher: Website -> Technology, using the existing
  httpx tool with -td (wappalyzer dataset). Each detected technology
  becomes a Technology node linked to the website with a
  USES_TECHNOLOGY relationship; results are de-duplicated per probe.

Tests cover the Technology type (label, from_string, registry), the
tech entry parser, enricher registration/metadata, and scan() with the
httpx Docker tool mocked, so no Docker daemon is required.

Closes #59
2026-06-09 10:45:43 +05:30
rachit367 b4e5102592 feat(enrichers): add domain_to_dns enricher using dnsx
Adds a `domain_to_dns` enricher that resolves a domain's A (IPv4) and
AAAA (IPv6) records through ProjectDiscovery's dnsx, emitting each
resolved IP as an `Ip` node linked to the domain with a `RESOLVES_TO`
relationship.

This complements the existing `domain_to_ip` enricher (which uses
Python's socket.gethostbyname and is limited to a single IPv4 result)
by leveraging the dnsx toolkit for full A/AAAA resolution.

Implementation:
- Extend DnsxTool with `resolve_domain()` that runs
  `dnsx -d <domain> -a [-aaaa] -json -silent` and parses the JSONL
  output (a/aaaa fields per retryabledns.DNSData) into a de-duplicated
  IP list. The existing CIDR `launch()` path is left untouched.
- New DomainToDnsEnricher (auto-registered via @flowsint_enricher) with
  an optional `ipv6` toggle and optional PDCP_API_KEY vault secret.
- Unit tests covering registry wiring, JSONL parsing (A/AAAA, dedup,
  blank/malformed lines, empty output) and scan() with the Docker tool
  mocked, so no Docker daemon is required to run them.

Closes #79
2026-06-09 10:28:32 +05:30
Eric 25b735b2a2 Merge branch 'main' of github.com:zurtix/flowsint 2026-06-07 08:57:04 -04:00
Eric a7d5861d5b Fixed type for custom type in type_registry_service to revert back to using name as to not break graph 2026-06-07 08:54:20 -04:00
Eric HowardandEric 86b254bbf9 Custom types replaced with proper custom_types_category value 2026-06-06 18:48:05 -04:00
Eric fc9208865d Custom types replaced with proper custom_types_category value 2026-06-06 18:44:21 -04:00
Eric f0b0b9bf82 Added category to custom types to reorginize into desired categories 2026-06-06 18:38:35 -04:00
aeonframework 0a3567af96 fix(security): Host-header allowlist + restore dropped security headers
Detected by Aeon + semgrep.
Severity: medium
CWE-350 (reverse-DNS trust) / CWE-352 (CSRF via DNS rebinding) / CWE-1021 (UI layering / dropped X-Frame-Options).

- Add `map $http_host $is_flowsint_host` allowlist + default-deny `if` at
  the top of the server block. Default permits localhost / 127.0.0.1 /
  ::1 (any port, case-insensitive); two commented-out template lines show
  LAN operators how to add their server hostname/IP.
- Re-declare the four `add_header` security headers in the static-assets
  and `/index.html` location blocks, which previously dropped them due to
  nginx`s replace-all add_header inheritance.
- README: one paragraph under "Deploy on a network" naming the new
  operator step alongside the existing `.env` rotation.
2026-06-05 20:45:38 +00:00
dextmorgnandGitHub 12bf2937c1 Merge pull request #176 from reconurge/ci/python-tests
ci: run python tests on pull requests and main
v1.2.10
2026-06-05 15:47:32 +02:00
dextmorgn 612d39eadf test: provide dummy Neo4j credentials in conftest
Any code path reaching the Neo4jConnection singleton requires NEO4J_*
env vars at construction — tests only passed thanks to developers'
local .env files. Driver creation is lazy, nothing connects.

Verified by running all four suites with every .env removed:
458 passed.
2026-06-05 15:34:58 +02:00
dextmorgn dc36ef633e test(core): factor out env-independent no-connection repo setup
Previous fix covered one occurrence; 17 other tests built
Neo4jGraphRepository(neo4j_connection=None), hitting the singleton
fallback that requires NEO4J_* env vars. Single helper, no env
dependency left.
2026-06-05 15:26:08 +02:00
dextmorgn 22c6908a0e test(core): stop relying on env credentials in no-connection test
Neo4jGraphRepository(neo4j_connection=None) falls back to the
Neo4jConnection singleton, which requires NEO4J_* env vars — the test
only passed locally thanks to .env. Pass a mock instead; the test
nulls _connection right after anyway.
2026-06-05 15:17:37 +02:00