Friday, August 14, 2026

Healthcare IT infrastructure: how to reduce downtime

IT infrastructure failures in healthcare aren’t measured in downtime percentages. They are measured in canceled appointments, delayed care, and halted production lines. Standard high-availability approaches can break down here because the environment is uniquely unforgiving, with complex interface chains such as Health Level Seven International (HL7) and Fast Healthcare Interoperability Resources (FHIR), strict regulatory oversight, and no IT staff on site at many remote locations.

When a recovery plan misses the mark, a simple hardware hiccup can quickly become a serious business problem. Clinics face missed billing windows and idle staff on payroll, while patients experience frustrating delays that can damage trust and push them toward competitors. Let’s break down how to engineer true resilience for clinics, diagnostic labs, imaging centers, and manufacturing floors where server downtime is simply not an option.

What is healthcare IT, and why does uptime matter?

Healthcare IT is the technology chain connecting people and equipment to data. When a clinician opens an Electronic Health Record (EHR), the request depends on the entire transaction path, from identity and DNS to storage and network. A lab analyzer similarly relies on middleware and interface engines before results reach the Laboratory Information System (LIS). If any link fails, the service can remain technically online while still being unusable.

Cloud hosting changes where components run, but the dependency chain remains. A SaaS EHR still requires local internet access and authentication, while a cloud archive needs a Digital Imaging and Communications in Medicine (DICOM) gateway and reliable bandwidth. Patient-facing touchpoints like mobile apps and portals extend the chain further, requiring authentication and duplicate handling before data reaches the patient record.

Applications typically exchange this data via HL7 standards, with HL7 v2 used for clinical interfaces and FHIR providing web-oriented APIs. Both provide structure for data exchange, but neither guarantees correct patient matching or a functioning interface.

For downtime planning, workloads generally fall into three buckets: those that stop operations immediately, those that allow a degraded manual workflow, and those that can queue data for later synchronization. This behavior determines the recovery target and helps you decide which systems need local failover and which can wait for a standard restore.

Core components of healthcare IT infrastructure

A resilient design starts with understanding what each infrastructure layer needs during normal operation and during a failure. As you build or review the environment, look at each layer from the perspective of a failure and ask what the rest of the workflow depends on.

Network paths need to be defined by failure domain, not convenience. When you map these paths, separate clinical access, management traffic, storage replication, and backups so they do not compete for the same pipe. Segment networks to limit lateral movement, encrypt data in transit, and log everything that touches protected health information (PHI).

Compute includes physical hosts, hypervisors, and VMs running the EHR, interface engines, communications, and specialist systems. When you size HA, assume that one host is unavailable and verify that the surviving host can carry the priority workload on its own.

Storage includes primary volumes, synchronized replicas, archives, and backups, each serving a different recovery purpose. When you review your storage design, make sure replication is complemented by versioned or immutable copies. Encrypt data at rest, because live replication alone does not provide a reliable recovery point if corrupted or encrypted data is replicated to the other copy.

Identity and access management determines who can see or change clinical data. This includes directory services, role-based permissions, service accounts, multifactor authentication for administrators, and controlled emergency access.

Monitoring and auditing cover the remaining operational requirements. Infrastructure telemetry tracks latency, capacity, failed paths, and resynchronization load. Audit logs record access and changes for incident review and regulatory evidence.

Core components of healthcare IT infrastructure

Figure 1. Core components of healthcare IT infrastructure.

On-premises, cloud, or hybrid?

The deployment model affects the failure domains you need to account for. On-premises infrastructure keeps device-facing services local and reduces WAN dependence. Cloud services reduce local hardware management, but provider availability, identity, connectivity, and data location become part of the failure model. Hybrid designs commonly keep equipment gateways on site while hosting EHR, analytics, or archives elsewhere.

When you compare these models, look at where each dependency sits and what happens when connectivity to that location is lost. Deployment location does not establish HIPAA compliance. Under the U.S. Department of Health and Human Services (HHS) cloud guidance, a provider handling ePHI on behalf of a covered entity or business associate is a business associate, and a compliant Business Associate Agreement (BAA) is required. Selection should therefore follow recovery targets, WAN tolerance, data-location rules, and operational responsibility.

Healthcare IT use cases by industry

The same uptime target can lead to very different infrastructure designs depending on the workload. To see how these differences affect infrastructure decisions, you can map each healthcare environment to the workflow at risk, the dependency teams often overlook, and the design decision that follows.

Healthcare environment Critical workflow Downtime impact Design focus
Clinics and hospitals EHR access, medication, and orders Staff lose access to clinical workflows Protect identity and interfaces; size for peak load
Diagnostic laboratories Specimen-to-result path Results cannot be matched or reported Test analyzer buffering and the full interface path
Medical imaging centers PACS ingest, retrieval, and reporting Studies queue or prior images disappear Size for ingest, archive growth, and resynchronization
Medical research Study data and audit records Data entry stops or record state is uncertain Use controlled recovery with retained audit trails
Pharmaceutical manufacturing MES, batch records, and quality status Production or batch review pauses Validate failover and infrastructure changes
Distributed and remote sites Local clinical services Staff wait for remote repair Standardize two-node deployments and monitoring

The table highlights an important point: recovering the server is only one part of restoring the workflow. The actual recovery target should be tied to the business or clinical process that depends on that server.

A laboratory recovery test does not end when the LIS server boots back up. It ends when a test result successfully maps to the correct patient MRN. When you test a laboratory recovery scenario, measure the buffer depth against your actual test volume: how many hours of data the analyzer can hold locally before overwriting data or overwhelming the interface engine with a large backlog.

Imaging represents a heavy storage workload because a single node often handles three concurrent jobs: serving active studies, ingesting new ones, and rebuilding a replica after failover. This simultaneous load can saturate disk IOPS and expose limitations that daily-average capacity figures do not show. If you size the environment using only daily-average figures, you can easily underestimate the load during failover.

Research and pharmaceutical systems introduce another compliance requirement: recovery must preserve a controlled record state. Under FDA guidelines for electronic records and data integrity, failover evidence matters just as much as raw recovery speed. You need to be able to demonstrate what happened during recovery and verify that the resulting records remain trustworthy.

At distributed sites, architecture is closely tied to supportability. If you manage multiple remote locations, standardization becomes especially important because your central team needs to troubleshoot the same architecture remotely. A standardized cluster and monitoring setup allows a central team to manage dozens of locations, while a unique stack at every site makes remote diagnostics, maintenance, and spare-parts planning much harder.

What causes healthcare IT downtime?

The failed component is not always the obvious server. Identity and DNS outages can make several healthy applications inaccessible at once. A bad virtual-switch change can isolate every VM on a host. Storage latency can look like an application problem. Interface engines, certificate services, and database connections often sit outside the workload inventory used for HA planning.

Maintenance introduces its own failure modes. An update can change a driver, a firewall rule can block an interface, or a certificate can expire after the team has tested only the application login and not the interfaces behind it.

When you review your HA plan, make sure these dependencies are included in the failure model, not just the servers and VMs. After any change in the EHR path, check the complete workflow:

  • Can a clinician open a chart and place an order, not just reach the login screen?
  • Is the interface engine routing messages end to end, not just showing a green “connected” status?
  • Did any firewall or network access control list (ACL) change block a port that an interface or service account depends on?
  • Are certificates still valid on every hop, not only the one the team remembered to check?
  • Does the failover path still complete within the RTO when tested with production-representative load?

Cyberattacks and site loss create different recovery problems. Ransomware can damage every synchronized copy that is reachable with the same credentials. Fire, flood, or a prolonged power failure can remove both cluster nodes at once. Those events move the response from local failover to backup or disaster recovery.

Why is backup not enough?

Backup cannot take over a live workload when a host fails. The data must be restored to working compute, the application must start, and its dependencies must reconnect. That recovery process can take longer than a clinical or production workflow can tolerate.

HA and backup address different failure scenarios, and treating them as interchangeable creates gaps in the recovery plan. When you review your recovery strategy, it helps to look at what each layer can actually recover from:

HA (synchronous replication) Immutable / air-gapped backup
Protects against Host, disk, or network hardware failure Ransomware, accidental deletion, data corruption
Recovery point Seconds (current state) Depends on backup schedule (hours to a day, typically)
Recovery time Automatic failover, usually minutes Manual restore, potentially hours
What it can’t stop A bad or malicious write replicates to both copies instantly A slow-burn hardware failure over weeks

Synchronous replication preserves the current state, including an accidental deletion, a corrupt write, or ransomware encryption. Two healthy replicas are therefore not two recovery points. Critical workloads still need backups isolated from production credentials and failure domains, on media that the HA cluster’s own admin credentials can’t access.

RTO should include the full service recovery, not just the time required to copy data. RPO should reflect the point to which the application can be returned without breaking its workflow or record obligations. Restore order matters too: identity and DNS may need to return before the database, followed by the application and its interfaces.

This is why a backup test can look successful while the actual service recovery fails. Testing one VM in isolation may produce a clean backup report, but it does not prove that the complete application stack can be restored and brought back into service within the required RTO.

How does a two-node HA cluster work?

In a two-node design, each server provides compute and local storage. Synchronous replication maintains matching data copies across the nodes and presents them as shared storage to the virtualization cluster. If one host fails, its VMs restart on the surviving host using the available storage copy.

The replication network becomes a critical part of this design. Synchronous writes add a network dependency because both copies need to commit the write before it is acknowledged. As a rule of thumb, sync replication between cluster nodes requires round-trip latency in the low single-digit milliseconds, commonly around 2-3 ms or better. As latency increases beyond that range, write latency on every VM can also increase, including during normal operation.

Replication links need to maintain that low latency consistently, along with enough bandwidth for production traffic and resynchronization after a node returns. When you size these links, account for the rebuilding state as well as normal workload traffic.

Quorum logic prevents both nodes from serving conflicting copies after communication breaks. The exact mechanism may use heartbeat channels, a witness, or node-majority logic. Where the witness lives matters more than many designs account for. If you place it in the same rack, on the same power circuit, or on the same physical host as one of the two nodes, a single event, such as a tripped breaker or rack switch failure, can take out a node and the witness together.

The surviving node can then lose quorum as well, and a cluster that should have failed over may stop with otherwise healthy hardware sitting idle. When you design a two-node cluster, treat witness placement as part of the failure-domain design.

Capacity is set by the failed state, not the normal one. One node must run the priority VMs and still meet application response targets. A technically successful failover that leaves Picture Archiving and Communication System (PACS) retrieval or LIS transactions too slow hasn’t met the operational requirement, regardless of what the uptime dashboard reports.

Failure mechanics: quorum, storage, and network design

Network partition and split brain

In a two-node cluster, a failed heartbeat or replication path can leave both servers powered on but unable to see each other. If both sides continue serving the same workload, their storage state can diverge. Quorum prevents this outcome by allowing only the partition with a majority of votes to keep clustered workloads online.

The witness holds a vote, not clinical data, which is why its placement is a network and power design decision. iSCSI, SMB Direct, and RDMA carry storage traffic; none of them determine quorum. Forcing both partitions online defeats the protection and can create conflicting writes.

When you plan the network, keep the quorum path and storage path in mind separately. A high-performance storage network does not compensate for poor quorum design, and a healthy witness does not fix an overloaded replication link.

PACS: archive size, burst traffic, and cache

DICOM is structured, but PACS storage behaves more like a large-object workload than a conventional transactional database. Daily acquisition may be predictable. A bulk migration, archive restore, or node resynchronization rarely is and can introduce a much larger sustained stream.

With synchronous replication, a foreground write is acknowledged only after both copies commit it. If a PACS import shares disks or links with EHR and LIS workloads, a large transfer can raise latency across the whole cluster. Write-back cache can absorb a short burst, but once the cache fills, throughput falls to the rate of the slower replica or network path.

For this reason, capacity tests should combine clinical reads, peak image ingest, and full resynchronization instead of benchmarking each workload in isolation. Keep recent or frequently read studies on the active HA tier. Move older DICOM objects to a PACS- or VNA-supported archive tier when retention and retrieval targets allow it.

When you plan archive migrations, throttle bulk transfers and verify that the archive remains searchable before removing the source copy. This gives you a practical recovery and availability check.

Storage and replication network

Separate client, management, cluster, storage, and backup traffic using physical paths, dedicated VLANs, and QoS. For iSCSI, use dedicated adapters or HBAs with MPIO. If iSCSI crosses a router, thoroughly test latency, packet loss, MTU, and failover across the entire path.

For a busy two-node storage cluster, 10GbE is a practical starting point, while 25GbE becomes appropriate once PACS ingest, VM writes, and resynchronization traffic saturate lower speeds. Always size links for the failed or rebuilding state rather than average daytime utilization.

Jumbo Frames require matching MTUs on every NIC and switch. SMB Direct needs RDMA-capable adapters and SMB Multichannel, while RoCE requires appropriate DCB and PFC configuration. Always run load tests with active replication and monitor latency, retransmissions, dropped packets, and queue depth.

The important part is to test these conditions together. A network can perform well under a synthetic bandwidth test and still struggle when VM writes, PACS ingest, and storage resynchronization compete for the same resources.

External SAN vs. 2-node HCI

For local HA storage under a healthcare workload, organizations typically choose between a dedicated SAN array and synchronous replication across local server disks, without a separate storage array.

A SAN can fit a large data center with dedicated storage admins, but it becomes more difficult to operate across a distributed clinic network. Each site with an external array introduces specialized hardware, firmware, support contracts, and additional failure modes into locations that may not have dedicated IT staff.

Two-node HCI collapses this complexity. Each server carries its own storage, replicates synchronously to its pair, and presents shared storage to the hypervisor without a separate SAN appliance or storage team.

StarWind implements this model in two ways. Virtual SAN (VSAN) runs on existing server storage for teams with in-house management skills. Alternatively, HCI Appliance (HCA) delivers pre-integrated compute, storage, virtualization, and support as a single box, ideal for multi-location rollouts where standardization outweighs hardware reuse.

Ultimately, the choice for distributed clinics comes down to operational overhead. Reusing servers can save money upfront, but it can also require more engineering time later when teams have to troubleshoot different hardware and software stacks across multiple sites. Standardized hardware with a single vendor escalation path can be easier to operate and support over a multi-year deployment.

When you compare the options, look beyond the initial hardware cost. Consider who will troubleshoot a failed component at 2 a.m., how quickly replacement parts can reach a remote site, and whether the central IT team can apply the same recovery procedure at every location.

Regardless of the storage approach, the protected unit remains the virtualized workload on the cluster. WAN services, SaaS availability, medical devices, and site-level disaster recovery remain separate design considerations.

How to control healthcare IT infrastructure costs

Cost control starts by matching protection to the workload instead of buying the same availability tier for every application. HA belongs where the operational cost of waiting for a restore exceeds the cost of redundant infrastructure. Lower-priority systems can use standard backup and recovery.

When you evaluate existing infrastructure, look at the failed-state requirements first. Existing servers are economical only if they can carry the failed-state load and have enough supported life left to justify the integration work. Cloud estimates also need to include redundant connectivity, data transfer, backup, monitoring, security tooling, and support, not just the compute line item.

Across remote sites, repeatable configurations and central monitoring can save more over time than a small discount on one-off hardware. If you manage multiple locations, standardization also reduces the time your team spends troubleshooting different configurations and planning replacement parts.

Healthcare security and regulatory requirements

Regulations do not prescribe a two-node cluster or a particular storage product. They shape the controls and evidence around the systems that store or process regulated records. Your infrastructure design therefore needs to support the required security and compliance controls without treating the HA platform itself as proof of compliance.

For covered entities and business associates, the current HIPAA Security Rule requires safeguards for the confidentiality, integrity, and availability of electronic protected health information. Its contingency-planning provisions cover backup, disaster recovery, emergency-mode operations, and plan testing. HA can support the availability component, but the compliance record comes from the broader risk and control program.

The CMS Emergency Preparedness Rule applies only to designated Medicare- and Medicaid-participating provider and supplier types, with requirements that vary by category. The CLIA program focuses on accurate, reliable, and timely human laboratory testing. For FDA-regulated research and manufacturing, Part 11, CGMP, validation, and data-integrity requirements may apply, depending on the system and records involved.

In you operate in the EU, GDPR governs personal-data processing, and NIS2 may impose cybersecurity and incident-reporting duties on healthcare entities within scope. Software that qualifies as a medical device falls under the EU MDR; IEC 62304 provides a lifecycle-process standard for medical device software. These requirements do not apply to every healthcare application or provider, so you need to check the applicable scope and obligations case by case.

Encryption keys and backup isolation

Security planning should continue down to the key-management level. An architecture record should clearly separate encryption at rest from encryption in transit. For a Windows cluster using BitLocker-protected volumes, key protectors sit at the volume and cluster layer, and recovery material must be escrowed outside the two-node failure domain. If replication uses TLS or IPsec, session keys exist for the connection, while long-lived credentials remain in the protected host keystore or an external KMS or HSM selected by the platform.

Your design should document where these keys and credentials are stored, who administers them, how rotation and revocation are handled, and what happens during failover if the key service becomes unavailable. NIST SP 800-57 provides the key-management framework; the exact implementation remains product- and hypervisor-specific.

Backup isolation is equally important. A two-node cluster does not provide an air gap or an immutable backup. Both replicas are online and receive the same authorized writes, so ransomware, deletion, or corruption can reach both. Cyber-recovery copies need a separate security and failure domain, separate credentials, and immutable retention or offline media.

CISA recommends offline backups, and NIST distinguishes replication from immutable and point-in-time recovery. When you test recovery, verify that the isolated copy can restore the complete application workflow, not just a single file.

An infrastructure review should connect each technical control to evidence: approved architecture, access rules, change records, backup results, failover tests, restore tests, and assigned owners. Product redundancy supports this work, but the surrounding processes and evidence still need to be maintained.

Conclusion

Planning for healthcare downtime means looking at workflows instead of isolated servers, whether the workload involves clinic access, lab results, or imaging queues. A two-node cluster can be a good fit when a failed host can’t wait for a rebuild, a single node can carry the operational load, and site recovery is managed separately.

As you plan your environment, define the protection boundary clearly. Use local HA to protect against on-site hardware and storage failures, while backups, network resilience, and documented recovery procedures address the failure scenarios that HA cannot cover. You need to keep the workflow running and make sure the recovery process works when the infrastructure is under pressure.

Frequently asked questions

How often should failover be tested in a clinical environment?

Test after any material infrastructure or application change and on a regular, risk-based schedule. A test is only complete when clinicians or staff can successfully finish the affected workflow, not simply when the virtual machine boots back up.

Who should participate in a healthcare recovery test?

At a minimum, IT, the application owner, and clinical, laboratory, or manufacturing staff who rely on the system daily should participate. Include compliance or security teams whenever regulated records or cyber-recovery scenarios are part of the test.

What belongs in a healthcare downtime runbook?

Include clear steps for who declares the outage, how clinical and operational workflows continue during the disruption, the exact order in which critical services must return, and how queued data or paper records will be reconciled once systems are back online.

Your runbook should also identify the people responsible for each step and the escalation path if recovery takes longer than the defined RTO. Keep it specific enough that someone who does not normally operate the environment can follow it during an incident.



from StarWind Blog https://ift.tt/hyHsYJO
via IFTTT

The Good, the Bad and the Ugly in Cybersecurity – Week 33

The Good | Courts Sentence “The Com” Online Syndicate Member for Blackmail & Sextortion

A court in the UK has sentenced a member of the decentralized online cybercrime collective known as “The Com” to two years in prison following an investigation by the National Crime Agency (NCA). Justin Swaddle, who operated under the digital aliases ‘Epstein’, ‘Rugen’, and ‘Moscow’ across Discord, Snapchat, and Telegram, pleaded guilty to multiple criminal charges of blackmail and child abuse. In addition to his sentence, the court ordered Swaddle’s placement on the National Sex Offenders Register and imposed a ten-year Sexual Harm Prevention Order.

Investigators revealed that Swaddle systematically targeted and groomed young, vulnerable victims globally, using popular chat platforms to exploit his targets. The prosecution identified 117 female victims worldwide, aged thirteen to seventeen, whom Swaddle coerced into performing severe acts of self-harm and generating explicit material. Rather than seeking financial gain, Swaddle was reportedly motivated by the online status and notoriety he obtained by sharing the media within exclusive subgroups. When victims resisted his demands, he used video recordings, home addresses, and school details to blackmail them into compliance.

The investigation, which the NCA initiated in January 2024 following Swaddle’s initial arrest by West Yorkshire Police, required extensive cross-border coordination. British officers collaborated closely with law enforcement agencies in the United States, Australia, Canada, Norway, and New Zealand to identify and safeguard affected children worldwide.

Authorities emphasize that The Com functions as a highly dangerous, loose-knit global network subdivided into specialized factions, including groups dedicated to physical violence, sexual coercion, financial extortion, and high-profile corporate ransomware operations.

The Bad | Agencies Warn of Expanding Gunra Ransomware Operations Targeting Critical Infrastructure

U.S., U.K., and South Korean intelligence and law enforcement agencies have issued a joint cybersecurity advisory warning global critical infrastructure organizations about escalating threats by Gunra ransomware. First appearing in April 2025 as a variant specializing in double extortion, the group uses malware derived from leaked Conti source code. Gunra targets public health, financial, and government sectors worldwide, with a heavy concentration of victims in Australia, East Asia, and Europe.

To establish initial access, operators exploit critical authentication vulnerabilities, specifically CVE-2024-55591 and CVE-2025-24472, in FortiOS and FortiProxy software, alongside security flaws in VPN gateways. While campaigns initially focused on Windows environments, the threat actors expanded to cross-platform operations by introducing a Linux variant. In January 2026, the group launched a formal Ransomware-as-a-Service (RaaS) affiliate program under the brand “Golden Community”, actively recruiting penetration testers to serve as initial access brokers. Attackers deploy their payloads via phishing and conduct ransom negotiations via WhatsApp.

Once inside a network, the actors utilize Impacket tools for credential dumping and lateral movement. They execute malicious tasks during nighttime hours, exfiltrating stolen documents to cloud services and deleting critical backup and archived data across primary and recovery centers. The malware leverages advanced ciphers like Salsa20 or ChaCha20 to encrypt terabytes of data in a limited timeframe.

Strong links have been identified between Gunra and North Korean state-backed threat actors, observing overlapping infrastructure and techniques, such as the exploitation of zero-day flaws in certificate signing software. Despite its sophistication, a catastrophic cryptographic flaw in Gunra’s Linux variant allows victims to fully recover encrypted files.

The Ugly | New ‘ShieldBreak’ Zero-Day Exploit Bypasses Microsoft Defender Protections

A security researcher known as ‘Nightmare Eclipse’ has released a novel Microsoft Defender zero-day exploit dubbedShieldBreakshortly after this month’s Patch Tuesday update. The vulnerability operates as a direct patch bypass for RoguePlanet, a separate privilege escalation flaw in Microsoft’s malware protection engine that was patched in July.

ShieldBreak PoC exploit demo (Source: Nightmare Eclipse)

Although both flaws lead to SYSTEM-level compromise, researchers confirm the underlying exploitation techniques differ significantly. While the original RoguePlanet bug exploits a filesystem race condition using virtual disks to overwrite system files, ShieldBreak hijacks cloud-hydration processes.

Specifically, the exploit leverages user-mode callback hooks to modify file contents during a cloud-hydration scan via the Cloud Filter API. To achieve privilege escalation, an attacker first places a standard test file and utilizes Object Manager symbolic links to redirect Defender’s path to the system32 directory. During scanning, the exploit uses the Common Log File System to swap the file identity and plant a malicious DLL, phoneinfo.dll, where a default system file does not exist. Triggering a scheduled Windows Error Reporting task subsequently forces the system to load this rogue library, spawning a shell with highest privileges.

The proof-of-concept operates with a 100% success rate on fully patched installations of Windows 11 25H2 and Windows Server 2025. Although Windows 10 remains vulnerable to the flaw, the current code does not natively support those legacy systems. Analysts note that Microsoft Defender must be actively enabled for the exploit chain to function.

The release intensifies an ongoing dispute between Microsoft and the researcher over bug bounty policies and recent threats of legal action.



from SentinelOne https://ift.tt/ayCS8o0
via IFTTT

Reproducible ESP32 Firmware Development with Docker and Docker Sandboxes

Firmware development has always been challenging: mismatched toolchains, “it works on my machine” builds, and the tension between maintaining legacy products and shipping new features. In this article we explore how you can use Docker and Docker sandboxes to ease firmware development, especially for ESP32 projects. Nowadays, teams end up supporting multiple hardware revisions, several ESP-IDF releases, and long-term customer deployments, all while iterating on new capabilities like Wi-Fi 6, Matter, or power optimizations.

The official espressif/idf Docker image solves the reproducibility problem. Docker Sandboxes (the sbx CLI) solve a newer one: letting AI coding agents work on your firmware at full speed without giving them the keys to your laptop. This article walks through a practical workflow that combines both: clean builds, parallel environments for new and legacy firmware, and safe unsupervised AI sessions.

Part 1: The Baseline – Building with the Official Image

The espressif/idf image ships a complete, pinned ESP-IDF installation: the framework itself, the Xtensa/RISC-V toolchains, Python environment, CMake, ninja, everything. A build needs one command:

docker run --rm -v $PWD:/project -w /project \
  -u $UID -e HOME=/tmp \
  espressif/idf:release-v5.4 idf.py build

A few details worth understanding rather than cargo-culting:

  • -u $UID -e HOME=/tmp makes the container run as your user, so build artifacts in build/ aren’t owned by root. HOME=/tmp gives the IDF tools a writable home for their caches.
  • Pin your tag. latest tracks the master branch and will break you eventually. vX.Y tags are fixed releases; release-vX.Y tags track the release branch and receive bugfixes. For products in maintenance, exact vX.Y.Z tags are the safest; for active development, release-vX.Y is a good balance.
  • If your mounted project is owned by a different user than the one in the container, Git will complain about “dubious ownership”. The image supports -e IDF_GIT_SAFE_DIR='/project' to whitelist the path (use : to separate multiple paths).
  • Enable the compiler cache with -e IDF_CCACHE_ENABLE=1 and persist it across runs by mounting a volume for it. Full rebuilds of a mid-size project drop from minutes to seconds.

Flashing and monitoring

On Linux, pass the serial device through:

docker run --rm -it \
  --device=/dev/ttyUSB0 \
  --group-add $(getent group dialout | cut -d: -f3) \
  -v $PWD:/project -w /project \
  -u $UID -e HOME=/tmp \
  espressif/idf:release-v5.4 idf.py flash monitor

The --group-add is needed because you’re running as $UID, not root, and the device node belongs to dialout.

On macOS and Windows, Docker Desktop cannot pass USB devices into containers. The clean workaround is a network serial bridge using RFC2217, which esptool supports natively. On the host:

pip install esptool
esp_rfc2217_server -p 4000 /dev/cu.usbserial-1420

Inside the container, point idf.py at the network port:

idf.py --port 'rfc2217://host.docker.internal:4000?ign_set_control' flash monitor

This looks like a hack but it’s actually a feature: once the serial port is a network endpoint, anything can reach it. Containers, CI runners, and (as we’ll see) sandboxed AI agents. Keep this trick in mind; it’s the linchpin of Part 3.

Hide it behind a Makefile

Nobody should type these commands twice. A small Makefile keeps the interface stable even if the plumbing changes:

IDF_IMAGE ?= espressif/idf:release-v5.4
PORT      ?= /dev/ttyUSB0

DOCKER_RUN = docker run --rm -it \
  --device=$(PORT) \
  --group-add $(shell getent group dialout | cut -d: -f3) \
  -v $(PWD):/project -w /project \
  -v idf-ccache:/ccache -e CCACHE_DIR=/ccache -e IDF_CCACHE_ENABLE=1 \
  -u $(shell id -u) -e HOME=/tmp -e IDF_GIT_SAFE_DIR=/project \
  $(IDF_IMAGE)

build:
    $(DOCKER_RUN) idf.py build

flash:
    $(DOCKER_RUN) idf.py flash

monitor:
    $(DOCKER_RUN) idf.py monitor

menuconfig:
    $(DOCKER_RUN) idf.py menuconfig

shell:
    $(DOCKER_RUN) bash

Now make build works identically for every developer and in CI, and switching IDF versions is make build IDF_IMAGE=espressif/idf:release-v5.3.

Part 2: Parallel Environments – New Features and Legacy, Side by Side

This is where the container approach stops being merely convenient and starts changing how you work. Because each container is fully isolated, you can run two different IDF versions against two different boards at the same time, on the same machine.

# Terminal 1 - new feature branch, IDF 5.4, experimental board
docker run --rm -it --device=/dev/esp32-experimental \
  -v $PWD/new-feature:/project -w /project \
  -u $UID -e HOME=/tmp \
  espressif/idf:release-v5.4

# Terminal 2 - legacy firmware, IDF 5.3, production board
docker run --rm -it --device=/dev/esp32-production \
  -v $PWD/legacy:/project -w /project \
  -u $UID -e HOME=/tmp \
  espressif/idf:release-v5.3

Typical uses: flashing experimental code on one board while a long-running soak test or customer demo stays untouched on the other; A/B-comparing power consumption between firmware versions; reproducing a field bug on the exact legacy toolchain while the fix is developed on the current one.

Stable device names with udev

/dev/ttyUSB0 and /dev/ttyUSB1 swap depending on plug order, which will eventually make you flash the wrong board. On Linux, pin them with udev rules keyed on the adapter’s serial number:

# find the serial numbers
udevadm info -a /dev/ttyUSB0 | grep '{serial}'
# /etc/udev/rules.d/99-esp32.rules
SUBSYSTEM=="tty", ATTRS{serial}=="A50285BI", SYMLINK+="esp32-experimental"
SUBSYSTEM=="tty", ATTRS{serial}=="B7743NM0", SYMLINK+="esp32-production"

After udevadm control --reload, the symlinks survive reboots and re-plugs, and your Makefile targets can reference boards by role instead of by enumeration accident.

Or codify it with Compose

If the two-environment setup is permanent, a compose.yaml documents it better than shell history:

services:
  new-feature:
    image: espressif/idf:release-v5.4
    volumes: ["./new-feature:/project"]
    working_dir: /project
    devices: ["/dev/esp32-experimental:/dev/ttyUSB0"]
    stdin_open: true
    tty: true

  legacy:
    image: espressif/idf:release-v5.3
    volumes: ["./legacy:/project"]
    working_dir: /project
    devices: ["/dev/esp32-production:/dev/ttyUSB0"]
    stdin_open: true
    tty: true

docker compose run new-feature idf.py flash monitor and the mapping from role to physical board is version-controlled.

Part 3: Docker Sandboxes – Letting AI Agents Work Unsupervised

Coding agents like Claude Code are genuinely useful for firmware work: porting components between IDF versions, writing unit tests, chasing config drift in sdkconfig. But to be useful they need to run things: builds, flashes, pip install, sometimes Docker itself. Giving an agent that freedom directly on your host, in bypass-permissions mode, is uncomfortable for good reasons.

Docker Sandboxes solve this with a stronger primitive than a container: each sandbox is a microVM with its own kernel, filesystem, network stack, and its own private Docker daemon. The agent can install packages, modify system config, build and run containers, and none of it touches your host. Your workspace directory syncs into the sandbox at the same path, so file paths in error messages match between the two worlds.

The CLI is small and clear:

# start Claude Code in a sandbox for the current project
sbx run claude

# work on a specific directory
sbx run claude ~/firmware/new-feature

# see what's running, resource usage, network requests
sbx

# list and clean up
sbx ls
sbx rm new-feature

Three properties matter for firmware work in particular:

  1. Disposability. The agent can trash its environment experimenting with esptool versions, partition tables, or custom toolchains. sbx rm and it never happened. Your host IDF setup, if you even have one, is untouched.
  2. Network policy. Sandboxes route traffic through a host-side proxy with three modes: open, balanced (default-deny with pre-approved developer and package-manager domains), and locked down. An agent that decides to curl your firmware to somewhere unexpected simply can’t.
  3. Credential isolation. API keys and tokens are injected by the host-side proxy into outgoing requests; the sandbox itself never sees them. A prompt-injected agent can’t exfiltrate what it doesn’t have.

But how does the agent flash a board?

Here’s where the RFC2217 trick from Part 1 pays off. The sandbox is a VM; there is no USB passthrough. But there is a network path to the host. So expose the serial port as a network service on the host:

esp_rfc2217_server -p 4000 /dev/esp32-experimental

and tell the agent (in your project’s CLAUDE.md or equivalent) to flash with:

idf.py --port 'rfc2217://host.docker.internal:4000?ign_set_control' flash monitor

Now the agent’s whole loop runs end-to-end inside the sandbox: edit, build in a container it spawned itself, flash real hardware, read the monitor output, fix the bug. The only thing it can reach on your machine is one serial port you explicitly published. That’s a remarkably good trade: full hardware-in-the-loop autonomy, minimal blast radius.

Run one sandbox per board and you get the parallel-environment pattern from Part 2, agent edition: an agent iterating on the experimental board via port 4000 while you, or a second locked-down agent, watch the production board via port 4001.

Honest caveats

Sandboxes are newer technology than containers, and it shows in places. MicroVM isolation is available on macOS (Apple Silicon), Windows 11, and Linux with KVM. Build performance inside the microVM is noticeably slower than native containers: fine for agent sessions, annoying for your own tight inner loop. And the agent runs in bypass-permissions mode by design; the isolation is the permission system, so review the diff before merging, same as you would for any contributor.

Part 4: Putting It Together – A Daily Workflow

  • Regular development: VS Code Dev Containers with the espressif/idf image (plus the Espressif IDF extension inside the container). Same image as CI, full IntelliSense, native-container speed.
  • AI-assisted experimentation: sbx run claude --branch <feature>. The branch flag keeps the agent’s commits on a worktree, so your checkout stays clean; review and merge when it’s done.
  • Multi-board testing: parallel containers (you) or parallel sandboxes (agents), one per device, with udev-stable names and one esp_rfc2217_server per board.
  • CI: GitHub Actions with the official espressif/esp-idf-ci-action, pinned to the same IDF version as your dev image. If a build passes locally, it passes in CI. It’s the same bits.
# .github/workflows/build.yml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { submodules: recursive }
      - uses: espressif/esp-idf-ci-action@v1
        with:
          esp_idf_version: v5.4
          target: esp32s3

Pro Tips

  • Pin exact image tags (release-v5.4, not latest), and record the tag in the repo (Makefile or compose file) so the toolchain version is part of the code review.
  • One project folder per product line (new-feature/, legacy/) with its own pinned image. Never share a build/ directory between IDF versions.
  • IDF_GIT_SAFE_DIR=/project kills the Git ownership warnings; IDF_CCACHE_ENABLE=1 plus a ccache volume kills the rebuild times.
  • Add --group-add for the dialout GID when combining --device with -u $UID.
  • On macOS/Windows, and always with sandboxes, RFC2217 is your serial transport. One server per board, one port per server.
  • Put the flash/monitor commands and port mapping in CLAUDE.md so agents discover the hardware setup without being told each session.
  • If your team standardizes on extra tools (clang-tidy, cppcheck, a particular esptool), bake a thin custom image FROM espressif/idf:release-v5.4 rather than installing them in every session.

Conclusion

Docker turned ESP32 builds from a fragile, machine-specific ritual into something reproducible enough to trust. Parallel containers turn one desk into a small hardware lab, with legacy and next-gen firmware coexisting without friction. And Docker Sandboxes close the last gap: they make it reasonable, not reckless, to hand an AI agent a real board and let it work.

If you’re still installing ESP-IDF directly on your host machine in 2026, you’re working harder than necessary. Try the two-board setup this week: new firmware iterating on one device, stable firmware soaking on the other. Then hand one of them to an agent in a sandbox and see how far it gets.

Happy hacking!

Learn more



from Docker https://ift.tt/w0TFYqO
via IFTTT

Week 2

This is "Week 2" by OffSec on Vimeo, the home for high quality videos and the people who love them.

from Vimeo / OffSec’s videos https://ift.tt/VDCfos0
via IFTTT

Thursday, August 13, 2026

Curiouser and Curiouser

Curiouser and Curiouser

Welcome to this week’s edition of the Threat Source newsletter.  

“Experiment is the mother of knowledge.” ― Madeleine L'Engle, A Wrinkle in Time
“Don't slide down the rabbit hole. The way down is a breeze, but climbing back's a battle.” ― Kate Morton, The Clockmaker's Daughter 

Hacker Summer Camp has come and gone, which means it’s time for you to start planning next year’s trip. I’m surely going to recap Camp Season, right? Nope.

One of the things that I’ve really enjoyed lately is a segment on the Beers with Talos podcast that we call “Make Hazel a Hacker.” If you haven’t listened to it, this is a perfect time to start. Each episode we take a few minutes and pose a security question, term, or concept to Hazel and force her to come up with an idea or explanation on the spot. There are no parameters, so she’s faced with the entirety of information security — past, present, and future. I know, it’s insane. The craziest part is that (I think) Hazel came up with this idea and still volunteered to put herself in the line of fire.

As we put Hazel’s feet to the fire, one of my favorite things happens: The rest of us listen in and offer our thoughts during her brainstorming process. Invariably, we’ve got three very different answers, ideas, hints, or directions for her. It’s surely maddening for Hazel, but to me, the best part of the discussion that inevitably follows is that although they’re all different, they’re all correct.  

For example, this past episode I asked her about a behavioral indicator (regarding “wallpaper.bmp”) that seems benign on its own, but can be interesting to use as a pivot for a threat hunt. We had various interesting angles to consider, backed by years of knowledge and experience. It gave us a good conversation, and that was a .bmp!

One of the most nebulous things to learn in this field is that multiple things can be both different and correct. When you are making your decisions this week — whether it’s deciding on a new pivot in your hunting, what devices to prioritize in your patching and updating, or which books or online training to focus on — take a quick second and get a second, third, and fourth opinion. Then try something that’s outside of your normal wheelhouse but sounds good when it’s proposed.  

None of this is a solo sport. It’s a team game and the best plays come from a mix of perspectives, experiences, and mistakes. The “right” answer can wear many faces, and your ability to hold different truths will lead you to undiscovered territory, the rabbit hole where anomaly lives and breathes. So... welcome back from Vegas. Now go down a rabbit hole on a path you wouldn’t normally take because one of your friends (Joe) or your mortal enemy (Dave) told you that it would work.

“She'd been to Narnia, Wonderland, Hogwarts, Dictionopolis. She had tessered, fallen through the rabbit hole, crossed the ice bridge into the unknown world beyond.” ― Anne Ursu, Breadcrumbs 

The one big thing 

Cisco Talos recently discovered "JWR," a previously undocumented, real-time phishing framework and likely variant of "The Outsider" phishing-as-a-service platform. JWR uses an open WebSocket connection that allows attackers to monitor keystrokes live and dynamically steer victims through fake checkout and login flows. Currently deployed via SMS lures impersonating regional toll and postal authorities, JWR enables operators to steal payment data, 2FA codes, identity documents, and device fingerprints. 

Why do I care? 

Because JWR is operator-driven in real time, attackers can actively bypass multi-factor authentication (MFA) by prompting victims for 2FA codes exactly when needed. The sheer volume of collected data gives threat actors a comprehensive identity profile primed for extensive follow-on fraud and network compromise. Furthermore, JWR's seamless integration with legitimate e-commerce platforms like Shopify makes these lures incredibly convincing to the untrained eye. 

So now what? 

Prioritize user education around SMS-based phishing (smishing), specifically regarding unsolicited delivery or toll fee messages. Monitor for unusual authentication attempts, as stolen device fingerprints and session tokens can bypass conditional access policies. Where possible, implement phishing-resistant MFA methods like FIDO2 hardware keys. For a complete list of indicators of compromise (IOCs) and coverage updates, read the full blog. 

Top security headlines of the week 

Ransomware hits Colombian Justice Ministry days before presidential transition 
The attack, which disrupted some services around illicit-drug monitoring and legal processes, came a day after Colombia's national CERT published threat intelligence warning that ransomware groups had increased their focus on the country. (Dark Reading

FBI investigating North Korean remote IT staffer working for U.S. agency 
It’s unclear what agency was impacted, how long the intrusion lasted, and whether any sensitive data was stolen. Experts say it’s highly likely the staffer was a remote IT employee doing contract work on behalf of an agency. (Federal News Network

Hackers leverage new Microsoft SharePoint exploit in attacks 
A proof-of-concept exploit for a critical Microsoft SharePoint authentication bypass security flaw in the JWT token validation pipeline is already being used in attacks. (BleepingComputer

Signal adds new security feature to thwart adversary-in-the-middle attacks 
Signal has introduced Automatic Key Verification, a new security feature that gives users a new way to ensure their encrypted chats haven't been intercepted. (BleepingComputer

A data breach at shipping giant Ceva Logistics is rippling across banks, retailers, Steam gamers, and beyond 
The cyberattack on Ceva is affecting at least eight warehouses across Europe used for shipping goods across the continent. Several companies reported that hackers took their customers’ names, home addresses, phone numbers, and email addresses used to place their orders from Ceva’s systems. (TechCrunch

Can’t get enough Talos? 

Don't scan that! QR code phishing and cloud-native threats 
What happens when a  QR code leads to a major security incident? In this episode, Amy sits down with Senior Incident Response Consultant Terryn Valikodath to break down a recent, high-stakes breach at an Australian medical center 

Microsoft Patch Tuesday for August 2026 
Microsoft has released its monthly security update for August 2026, which includes 421 vulnerabilities affecting a range of products, including 62 that Microsoft marked as "critical." One of the vulnerabilities disclosed this month has been exploited in the wild. 

“Keep going, bro. You’ve got this!” A data-driven look at how adversaries are weaponizing AI 
How are adversaries weaponizing AI in the wild? By analyzing prompt logs left behind on endpoints, we found threat actors successfully bypassing guardrails to use AI as malicious software engineers, criminal force multipliers, and vulnerability research accelerators. 

Upcoming events where you can find Talos 

Most prevalent malware files from Talos telemetry over the past week 

SHA256: 9f1f11a708d393e0a4109ae189bc64f1f3e312653dcf317a2bd406f18ffcc507  
MD5: 2915b3f8b703eb744fc54c81f4a9c67f  
Talos Rep: https://talosintelligence.com/talos_file_reputation?s=9f1f11a708d393e0a4109ae189bc64f1f3e312653dcf317a2bd406f18ffcc507 
Example Filename: VID001.exe 
Detection Name: W32.9F1F11A708-100.SBX.TG** 

SHA256: 90b1456cdbe6bc2779ea0b4736ed9a998a71ae37390331b6ba87e389a49d3d59  
MD5: c2efb2dcacba6d3ccc175b6ce1b7ed0a  
Talos Rep: https://talosintelligence.com/talos_file_reputation?s=90b1456cdbe6bc2779ea0b4736ed9a998a71ae37390331b6ba87e389a49d3d59 
Example Filename: tmp00055df5.dll  
Detection Name: Auto.90B145.282358.in02 

SHA256: a31f222fc283227f5e7988d1ad9c0aecd66d58bb7b4d8518ae23e110308dbf91 
MD5: 7bdbd180c081fa63ca94f9c22c457376  
Talos Rep: https://talosintelligence.com/talos_file_reputation?s=a31f222fc283227f5e7988d1ad9c0aecd66d58bb7b4d8518ae23e110308dbf91 
Example Filename: d4aa3e7010220ad1b458fac17039c274_62_Exe.exe  
Detection Name: Win.Dropper.Miner::95.sbx.tg** 

SHA256: c4dd71e347a076ba24bdd2d0ee532ef991c1ef25a2431a19f850942ba2ab16b2  
MD5: 9a47c4d379998ade2f8f99e23a630c06  
Talos Rep: https://talosintelligence.com/talos_file_reputation?s=c4dd71e347a076ba24bdd2d0ee532ef991c1ef25a2431a19f850942ba2ab16b2 
Example Filename: WCInstaller_NonAdmin.exe  
Detection Name: W32.C4DD71E347-95.SBX.TG 

SHA256: 9896a6fcb9bb5ac1ec5297b4a65be3f647589adf7c37b45f3f7466decd6a4a7f  
MD5: 38de5b216c33833af710e88f7f64fc98  
Talos Rep: https://talosintelligence.com/talos_file_reputation?s=9896a6fcb9bb5ac1ec5297b4a65be3f647589adf7c37b45f3f7466decd6a4a7f 
Example Filename: SECOH-QAD.exe  
Detection Name: Win.Tool.Procpatcher::1201



from Cisco Talos Blog https://ift.tt/HqlZ2oy
via IFTTT

Netgate Releases pfSense Plus Software Version 26.07

pfSense® Plus software, the world's leading firewall, router, and VPN solution, delivers secure network edge and cloud networking capabilities for millions of deployments worldwide.

Today, Netgate® is releasing pfSense Plus software version 26.07. We strongly encourage all pfSense Plus customers to upgrade to the latest version. This release contains exciting new features exclusive to the Netgate Nexus controller: CoreDNS, Threatgate, and Snort version 3.

New Features and Improvements

CoreDNS

A high-performance, integrated DNS component that handles DNS-based tasks with exceptional speed and efficiency, powered by a new and exclusive Netgate plugin called rexdns.

Threatgate

A powerful, high-performance component that manages bulk lists of addresses and domains for firewall rules, aliases, and CoreDNS groups. Administrators can block these lists outright or create custom rules based on their content.

Threatgate and CoreDNS were built to integrate tightly together, enabling rapid processing and utilization of even massive lists - all while maintaining excellent performance on small, resource-constrained devices.

Snort Version 3

The updated version of the popular open-source intrusion prevention system (IPS), featuring multi-threading support, and a faster rule syntax, is now available exclusively via the new Netgate Nexus controller GUI.

In addition to the features listed above, this software release includes critical security updates for WireGuard (CVE-2026-58085), and other security enhancements.

Other fixes and enhancements were made to:

  • DHCP
  • DNS Resolver
  • DynamicDNS
  • Gateways and Monitoring
  • IPsec
  • VXLAN Interfaces
  • OpenVPN
  • Firewall Rules and NAT
  • Traffic Shaper
  • Wireless support

This release includes over 31 updates, bug fixes, and enhancements.

Using the New GUI

For more than two decades, our legacy PHP-based GUI and backend have served us exceptionally well. They provided a familiar and reliable interface that helped establish pfSense and its many derivatives as trusted leaders in the networking industry.

However, as networking demands have evolved, that codebase has grown increasingly outdated. Its architectural limitations and accumulated technical debt no longer align with our vision of delivering the fast, responsive, and truly modern user experience our customers expect and deserve.

That's why we're excited to announce our transition to a completely rewritten system built on Go. This modern architecture, already powering the new UI in the Nexus Controller, delivers significant performance improvements, a powerful, full-featured API, and true cross-platform compatibility.

Whether you manage a single pfSense Plus firewall or an entire fleet, the Netgate Nexus controller delivers a modern, refreshed management experience built for the way you work today.

Getting started is simple:

  1. Go to System > Advanced.
  2. Switch to the Netgate Nexus tab and enable it.
  3. Log in to Nexus on port 8443 of your firewall.

More detailed documentation can be found here. Start using it today and get immediate access to the new features and capabilities coming to pfSense Plus.

Note: Virtual machines as well as some third-party platforms may not support the new GUI due to missing machine information required to correctly run the software.

Release Notes

Detailed release notes for pfSense Plus 26.07-RELEASE are available in the pfSense documentation.

Installing the Upgrade

Netgate has a detailed Upgrade Guide in the pfSense documentation that explains the process. Below are the high-level steps to perform the upgrade.

Note: New installations of pfSense Plus 26.07 require Netgate Installer version 1.3 or later, available for download here.

For users currently running pfSense Plus software:

Upgrades are typically performed through the web interface. As always, back up your configuration before upgrading.

Navigate to System > Update

Set the Branch to "Current Stable Version (26.07)"

Click Confirm to begin the upgrade

For users running pfSense Community Edition (CE):

We encourage you to migrate to pfSense Plus to access all the latest features, performance improvements, and ongoing development. Details are available on the Netgate website.

Troubleshooting

Please review the documentation on Troubleshooting Upgrades for the most up-to-date information on working around upgrade issues.

This pfSense Plus software release is ready for use in production environments. Should any issues arise, please post to our forum or contact Netgate Technical Assistance Center (TAC) for paid 24/7/365 support.

Supporting the Project

Your purchases directly support the engineering teams building the future of pfSense. When you buy Netgate hardware, pfSense Plus software, TAC subscriptions, or use our AWS/Azure cloud instances, you help fund continued innovation, including the shift to our high-performance Go-based platform.

Ways to support the project:

  • Purchase an official system directly from Netgate or from our worldwide reseller partner network. Our appliances are the fast, easy way to get up and running with a fully-optimized firewall.
  • Purchase a technical assistance subscription (TAC), which provides you with direct 24/7 access to our Netgate Global Support team.
  • Purchase Professional Services to access our most senior engineers for more complex projects outside the scope of TAC support.
  • Use a genuine pfSense Plus instance from Netgate to connect and protect your cloud workloads on AWS and Azure.

Thank you to our customers and the community for your continued support. Your involvement helps strengthen pfSense for everyone.



from Blog https://ift.tt/3NISvtV
via IFTTT

Packer v1.16.0 brings verifiable provenance to machine images

Today we're announcing the release of Packer v1.16.0, which introduces native support for generating, signing, and verifying SLSA provenance attestations for every image Packer builds. Machine images are the foundation every workload runs on, and a compromised or tampered image can silently propagate to every instance launched from it. Until now, tracking down the origin of a problem meant digging through build logs that may no longer exist. With this release, Packer provides a cryptographic, tamper-evident record of every build without requiring any separate provenance tooling.  

This release also ships a handful of HCL2 improvements that make day-to-day template authoring easier. 

In this post, we cover the new provenance post-processor, the packer verify-attestation command, SLSA build levels, and the smaller quality-of-life improvements also included in this release. 

Why provenance matters for machine images 

The SLSA framework (Supply-chain Levels for Software Artifacts) defines progressively stronger guarantees about how software artifacts are produced. Until now, SLSA tooling has largely focused on application packages and containers. Machine images have received less attention than many supply-chain security workflows. 

A provenance attestation is a signed, machine-readable statement that records the origin of an artifact. It captures the Git commit the build ran from, the repository and ref it came from, the CI pipeline that triggered the build, and the timestamps for when it ran. For local artifacts, attestation is bound to the SHA-256 digest of the artifact file. For cloud artifacts without local files, Packer derives the attestation subject from a canonical identity record. This record always contains the builder ID and artifact ID, and optionally includes the artifact's registry state (such as an HCP Packer registry URI) when the builder provides it. 

Packer generates attestations as in-toto statements carrying an SLSA Provenance v1 predicate. This is the vendor-neutral format that supply-chain security tooling already knows how to consume and verify. 

The provenance post-processor 

Adding provenance to an existing build requires a few lines of HCL: 

build {  

  source "amazon-ebs" "my-image" { ... }  

  post-processor "provenance" {  

    signing_mode        = "keyless"  

    upload_tlog         = true 

    keyless_identity    = var.keyless_identity 

    keyless_oidc_issuer = var.keyless_oidc_issuer 

    output_dir          = "attestations/"  

  }  

After the build completes, Packer writes a signed attestation envelope to the attestations/ directory as a plain JSON file. Store it in S3, a container registry, an artifact store, or alongside the artifact itself. 

For local artifacts, every attestation captures the artifact name and its SHA-256 digest. For cloud artifacts without local files, it captures a digest of the canonical artifact identity. It also records available Git and CI metadata, the builder identity, and build timestamps. 

Signing modes 

We built four options so teams can adopt provenance without overhauling their key management setup first:

Mode

How signing works 

Best for 

none

Unsigned JSON statement 

Getting started; storing in a trusted internal system 

key 

Local PEM private key 

Air-gapped environments; teams with an existing PKI 

kms 

Cloud KMS or HashiCorp Vault 

Production workloads with centralized key management 

keyless 

Sigstore Fulcio with optional Rekor 

GitHub Actions and CI pipelines with no long-lived key 

<p></p>

For kms mode, the provider is selected automatically from the URI: 

awskms://1234abcd-12ab-34cd-56ef-1234567890ab   # AWS KMS  

gcpkms://projects/my-proj/locations/global/...  # GCP Cloud KMS 

azurekms://my-vault.vault.azure.net/keys/mykey  # Azure Key Vault  

hashivault://my-signing-key                     # HashiCorp Vault 

Credentials are read from the environment in the standard way for each provider. 

SLSA build levels 

SLSA defines a ladder of trust rather than a single pass/fail threshold. Here is how each level maps to what Packer provides. 

Build L1: Signed provenance exists 

Add the provenance post-processor to generate a record that identifies the artifact by digest and describes how it was produced. Signing is optional at L1: signing_mode = “none” writes an unsigned JSON statement. The provenance must be distributed with the artifact to satisfy L1.  

Build L2: A hosted service generates and signs the provenance 

Run Packer on GitHub Actions or another hosted CI platform and sign using keyless mode. The CI job's OIDC identity becomes the signer, so there are no static credentials to manage or rotate. Upload the attestation to the Rekor public transparency log to add auditable transparency log evidence. A ready-to-use reference workflow is included at examples/ci/github-actions-l2-keyless.yml. This pattern supports L2 only when the hosted build platform and provenance-generation controls meet the SLSA L2 requirements. 

Build L3-compatible: Provenance generation is isolated from the build 

The build job publishes only the artifact digest. A separate, isolated signing job handles the attestation and never shares a process space with the build steps. The reference workflow at examples/ci/github-actions-l3-delegated.yml uses slsa-framework/slsa-github-generator to demonstrate an L3-compatible delegated signing pattern. It does not establish L3 on its own; L3 also depends on hardened-platform and build isolation controls. 

Verifying attestations with packer verify-attestation 

Provenance is only useful if it gets checked before an image is used. The new packer verify-attestation command is designed to sit inside a deployment pipeline or pre-flight script: 

packer verify-attestation \  

  -signing-mode        keyless \  

  -keyless-oidc-issuer https://token.actions.githubusercontent.com \  

  -keyless-identity    https://github.com/my-org/my-repo/.github/workflows/build.yml@refs/heads/main \  

  -builder-id          https://github.com/my-org/my-repo \  

  -source-uri          git+https://github.com/my-org/my-repo \  

  -require-rekor \  

  -require-timestamp \ 

  -bundle attestations/my-image.qcow2.provenance.sigstore.json \ 

  -artifact my-image.qcow2 \ 

  attestations/my-image.qcow2.provenance.json 

If any check fails, the command exits non-zero, and the deployment is blocked. You can enforce as much or as little as your environment warrants: At minimum, verify the signing identity and the artifact digest; for L2, add -require-rekor and -require-timestamp

This directly enables several common use cases: 

  • Deployment gates: Block any image that cannot produce a valid signed attestation from your trusted CI pipeline 

  • Incident response: When a CVE drops, correlate the affected commit with images built from it and, when integrated with the inventory and deployment records, the running instances that may be affected

  • Compliance and audit: Provide signed provenance evidence that can support SOC 2, FedRAMP, or internal security-control reviews; the attestation does not establish compliance by itself

  • Shadow build detection: Verify that golden images came from approved pipelines rather than ad hoc builds

Other improvements in v1.16.0 

continue_on_error for provisioners 

The new continue_on_error meta-argument lets you mark a provisioner as non-fatal. When it fails, Packer logs a warning and continues to the next step rather than halting the build. This is useful for optional diagnostics, telemetry, or cleanup scripts that should not block image delivery.  The option applies to HCL2 templates. 

provisioner "shell" {  

  inline            = ["run-diagnostics.sh"]  

  continue_on_error = true  

Provisioners without this flag behave exactly as before. 

optional() in object-type variables 

Object variables now support the optional() modifier for per-attribute defaults. Callers only need to provide required fields; optional fields fall back to their declared defaults. This makes it easier to evolve shared variable schemas without updating every caller at once. 

variable "image_config" {  

  type = object({  

    name    = string  

    region  = optional(string, "us-east-1")  

    encrypt = optional(bool, true)  

  })  

New timestamp template functions 

rfc3339_parse() parses an RFC 3339 timestamp into a structured object, including a unix field. unix_timestamp_parse() parses a Unix epoch integer into a structured object, including an rfc3339 field. Both are useful for stamping image names and tags with build-time date components without reaching for a shell script. 

Get started 

Think: Packer now gives you a signed, verifiable record for builds configured with the provenance post-processor. 

Feel: Confident that your image supply chain is auditable and defensible. 

Do: Upgrade to v1.16.0 and add the provenance post-processor to your next build. 

The new features described here are opt-in, and existing templates require no changes to continue building with Packer v1.16.0. 

Here are some helpful resources: 



from HashiCorp Blog https://ift.tt/HWazqSN
via IFTTT

Dissecting the JWR phishing framework

  • Cisco Talos recently identified an undocumented phishing framework, internally branded "JWR" by its developer, built to convincingly impersonate checkout and login pages across major payment and shopping platforms. 
  • The client engine of the JWR phishing framework is a real-time, operator-driven system that, rather than merely logging form submissions like a static credential-stealing page, keeps an AES-CTR encrypted WebSocket open to the threat actor so they can steer each victim's session live. 
  • The victim data targeted by the actor using JWR extends well beyond payment data, encompassing identity documents, Social Security numbers, passport and driver's license images, website and PayPal credentials, 2FA codes, and full device fingerprints, all committed to the actor's server once a session ends.  
  • Talos assesses with medium confidence that the JWR phishing framework is a variant of "The Outsider," a phishing-as-a-service (PhaaS) platform, based on several similarities in the client engine scripts and functionalities of the two PhaaS platforms. 
  • Talos observed a real-world campaign delivering the JWR client via SMS lures impersonating toll authorities, and postal and courier services of several countries in Southeast Asia and the Middle East.

JWR phishing framework, a likely variant of the Outsider 

Dissecting the JWR phishing framework

JWR is a phishing framework capable of harvesting complete payment card data, login credentials, and personally identifiable information (PII) documents and images in real time. The client-side engine of the framework impersonates login, and checkout flows of several payment gateways, including Shopify, PayPal, Apple, Klarna, and banks, while allowing the operator to stealthily control the victim session through an AES-CTR encrypted WebSocket channel. The client engine architecture is divided into a Host Bridge module that relays commands into a phishing inline frame (iframe) and a Vue.js victim application that renders across 44 phishing pages, streams the victim's keystrokes to the actor as they are typed, and carries out more than 40 distinct instructions issued from the command-and-control (C2) console. The data exfiltration schema is a cvvform object that includes fields such as credit card number, CVV, PIN, expiry date, Social Security Number (SSN), passport or ID images, two-factor authentication (2FA) codes, website logins, PayPal credentials, and device fingerprint.  

Talos discovered that the JWR client engine shares significant code and functional similarities with the client of The Outsider PhaaS platform operated by the Chinese-speaking actor “Outsider Enterprise,” which was reported by external researchers

JWR client architecture and workflow

Dissecting the JWR phishing framework
Figure 1. JWR phishing framework’s client engine architecture and execution flow.

The execution starts when the parent phishing webpage loads and executes the client's engine. It checks a single global flag, window.__HOST_MODE, which is set by the parent phishing page, and selects one of two execution modes. If the flag is set, the script enters Host Mode, and control passes to the Host Bridge module, an immediately invoked function expression (IIFE) that operates within the parent page, typically a replica of a legitimate checkout or account login page, relaying received details into a child iframe that contains the actual phishing form. It establishes a persistent WebSocket connection to the actor’s C2 server. 

If the flag is not set, the page enters Content Mode, and control passes to the Vue.js Application, an interactive front end that renders the phishing pages, collects victim input, manages the flow across 44 HTML files, and handles the actor’s instructions from the C2 server, ultimately redirecting to a custom error page after sending the data to the C2. The Content Mode of execution has three communication modes: standalone, pluginIframe, and hostIframe. 

  • In standalone mode, the application fully owns its WebSocket connection. 
  • In pluginIframe mode, it has no direct link to the network at all and instead sends everything upward to an embedding plugin frame. 
  • In hostIframe mode, it defers entirely to a parent page already running as the relay bridge. 

Regardless of which of these three modes or through the Host Bridge is used, the data is either sent to C2 as plain text in JSON format with the DEV_MODE flag set, or it is passed to the JwrCrypto module, which encrypts it with a newly generated key before sending it to the C2 server.  

The script engine includes a background worker module that maintains the connection with C2, keeping it alive independently of page navigation for the remainder of the session. In a live session activity, the script continuously streams the victim’s keystrokes to the actor's C2 server as captured data, while that the actor continuously sends the next instruction to be executed from the C2 server. Each incoming instruction is checked by the client engine against a brief history to ensure that nothing already executed runs twice, then routed by the Instruction Handling module to one of two outcomes including, redirecting the victim to a different phishing page or updating the current page's state and displayed status, awaiting the actor’s next instruction. This execution loop repeats until the actor decides to keep the session alive, and when the actor chooses to close the session, the accumulated data is transmitted to the C2 one last time, and the victim is redirected. 

JWR Client’s host bridge mode  

In host bridge mode, the IIFE establishes a persistent WebSocket connection to the actor's server, manages the victim's session identity, excludes repeating incoming instructions, and proxies all communication between the server and the phishing child iframe. 

Every victim is assigned a unique session token the moment the bridge initializes. It first checks persistent storage for an existing JWRCID value if the victim has visited the page before, and if true, the same token is reused, allowing the actor to correlate multiple visits from the same device. If none exists, a new token is generated in the format JWRCVV-{Date.now()}-{random1}-{random2}, with both random segments being 13-character base-36 strings, and this token becomes the victim's permanent identifier for the entire C2 communication. 

The module then spawns a Web Worker from a separate script located at static/js/ws-worker.js, which isolates the WebSocket from the main JavaScript context, allowing the connection to persist during navigation within the phishing flow. The WebSocket connection path is constructed as webSocket/QT/{sessionId}/khkjsahfjkwhakjlsdwdddddd88, where the alphanumeric suffix is likely a server-side authentication token that ensures the connection originates from a deployed kit instance. 

Dissecting the JWR phishing framework
Figure 2. Deobfuscated view of JWR client’s host bridge mode initialization.

The host bridge incorporates an anti-analysis check, which serves as a one-time execution guard that performs a self-referential .toString().search() call against a backtracking regex. This check detects whether a debugger has attached the function to modify its apparent source. Additionally, a decoy variable is scattered throughout the code to mislead static-analysis tools. 

Moreover, it maintains a JSON array named JwrExecutedInstructions in sessionStorage to prevent the same operator instruction from executing more than once. Before relaying any instruction into the phishing iframe, it verifies the instruction ID against a list. If a match is found, it discards the repeating instructions. If it is a new instruction, it sends an acknowledgment back to the C2 server in the format {type:"instructionAck", instruction_id:, cvv_id:}. The list is limited to 50 entries and is trimmed to retain the most recent 30. 

Dissecting the JWR phishing framework
Figure 3. Deobfuscated view of JWR client’s instruction handling and acknowledging functions of Host bridge mode.

Content Mode operation (Vue.js application), the real-time capture 

The Vue.js victim application developed by the JWR developer is a single Vue 2.X instance, window.vm = new Vue ({el: ‘#app’, ...}), mounted on a Document Object Model (DOM) element with the id “#app”. This application serves as the phishing page that the victim sees and interacts with. It is responsible for rendering the checkout forms, collecting and streaming input to the C2, executing the actor’s instructions, and performing the exfiltration function. 

When the Vue instance is constructed, the created function is executed, processing the data passed from the fake webpage the victim visited, but without attaching the page. It generates the session ID and clears any sensitive fields leftover from a prior page visit if the victim had previously accessed the same fake page. It also restores any previously saved session state from “sessionStorage” if it exists. Then, it redirects the victim from any page other than index/login/home that lacks a session ID to a_index.html, ensuring the victim enters the phishing flow. Finally, the Vue takes the rendered output and attaches it to the #app element in the page's DOM, making the interface visible and interactive to the victim. 

Once the DOM is ready, Vue executes the mounted function asynchronously, at which point the victim becomes visible to the actor. It determines the engine’s execution mode and then executes two functions: getIPInfo() to geolocate the victim’s IP address and getSyncSettings() to pull the actor’s configuration from the C2 server. Next, it initializes the communication channel, captures the victim's action, and creates a CVV form with the victim's device fingerprint data. This includes the victim's current form of state, such as device type, browser, language, time zone, and geolocation, which are encrypted and sent to the actor's C2 server. 

Dissecting the JWR phishing framework
Figure 4. Deobfuscated view of JWR client’s Vue app’s initialization and mounting functions.

One of the key features of the JWR kit is its near-real-time input streaming. Each input element in the phishing form is transmitted to the actor’s console, allowing the actor to view partial card numbers, partial passwords, and partial verification codes as the victim types, without needing to wait for the victim to click any submit button. This mechanism enables the actor to see the victim's data and determine which instruction to send to the client's engine from the C2 before the victim even submits the form. 

Before the Vue instance is created, the client engine establishes an instruction mapping table that correlates over 40 actor command names with specific HTML page filenames, thereby granting the actor remote control over the victim browser session. 

Dissecting the JWR phishing framework
Figure 5. Deobfuscated view of JWR client’s Vue app’s initialization and mounting functions.

The JWR client script includes a C2 command dispatcher. When the actor sends an instruction, the client receives, decrypts, and forwards it to the dispatcher function, which routes it to the appropriate handler based on the instruction type. The table below displays the actors' instructions from C2, facilitated by the JWR client kit. 

Instructions 

Purpose 

to_index 

Send victim to the landing/entry page 

to_login 

Send victim to site-login page 

to_password 

Prompt for account password 

to_info 

Collect PII 

to_card 

Send victim to card-entry page  

to_qr 

Show QR code for scan-based verification 

to_sms 

Request SMS OTP 

to_sms_login 

Request SMS OTP for login step 

to_sms_bank 

Request SMS OTP for bank verification 

to_2fa 

Request 2FA code 

to_text_verify 

Request custom text/code verification 

to_email 

Request email OTP 

to_pin 

Request card PIN 

to_app 

Request bank-app push approval 

to_login_app 

Request app-based login approval 

to_bank_login1 

Step 1 of multi-stage bank login 

to_bank_login2 

Step 2 of multi-stage bank login 

to_bank_login3 

Step 3 of multi-stage bank login 

to_custompage 

Route to a custom/template-defined page 

to_shop 

Show fake storefront/shop page 

to_paypal_login 

Collect PayPal login credentials 

to_paypal_card 

Collect card data via PayPal-branded flow 

to_paypal_card_verify 

Request card verification text (PayPal flow) 

to_paypal_sms 

Request PayPal-linked phone OTP 

to_paypal_email 

Request PayPal-linked email OTP 

to_paypal_pin 

Request PayPal PIN 

to_paypal_app 

Request PayPal app-approval verification 

to_apple_login 

Collect Apple ID login 

to_apple_sms 

Request Apple-linked SMS OTP 

to_apple_email 

Request Apple-linked email OTP 

to_apple_card 

Collect card data via Apple-branded flow 

to_apple_verify 

Request generic Apple verification step 

to_klarna_login 

Collect Klarna login credentials 

to_klarna_sms 

Request Klarna-linked SMS OTP 

to_klarna_email 

Request Klarna-linked email OTP 

to_klarna_pay 

Collect Klarna payment details 

to_klarna_pin 

Request Klarna PIN 

to_success 

Sends full data to the C2 and redirect victim to a real site 

to_redirect 

Redirect victim out to an operator-supplied URL 

tip_fail 

Show generic declined/invalid error, force re-entry 

tip_custom_fail 

Show an operator-authored custom error message 

to_page_custom_fail 

Route to a custom failure page defined per template 

tip_change_card 

Fake card-declined prompt to extract a second/different card 

updata_img 

Push a new image likely a refreshed QR code without navigating 

updata_2fa 

Silently inject/display an OTP code supplied by the operator 

text_updata_verify 

Push custom verification text to display, without navigating 

submitResult 

Operator pushes a corrected or enriched copy of the victim's form data back into the session  

The JWR client engine has a data exfiltration schema. Its scope extends well beyond payment data, and includes full identity information (name, gender, date of birth, Social Security Number, passport, driver's license, medical record number), address, email and email password, up to three sets of website credentials, PayPal login, complete card data (PAN, expiry, CVV, PIN, brand, issuer, issuing country), front and back card images, photos of identity documents, and an automatically captured browser fingerprint, including IP, device, language, time zone, user agent, cookies, and geolocation. 

Upon submission, the client normalizes the submission types, triggering a full-screen non-interactive overlay over the page. For credit card submissions, a Lottie animation is displayed that corresponds to the card brand detected from the first two BIN digits. After exfiltration, when the actor closes the WebSocket, terminate the worker and POST the entire cvvformobject to the C2 endpoint at api/open/the_final_interface. Once the actor confirms, the victim is redirected to the actual site. 

Talos discovered that the primary mode of C2 communication for the JWR kit is via a binary WebSocket connection. The WebSocket path follows the format shown below, where the JWRCID and JWRCVV segments encode the victim’s unique session token, and the trailing alphanumeric suffix is likely a server-side authentication token. 

Dissecting the JWR phishing framework
Figure 6. Sample C2 connection initiation function of JWR client.

Alongside the WebSocket, the JWR client registers five Representational State Transfer (REST) endpoints which are used as an alternate communication method, between the C2 and the victim browser. In this case, a session opens with api/open/addClick, executed once from within the mounted function after the phishing page becomes visible to the victim. It reports the victim's IP address, country, the specific phishing page they landed on, the referring or storefront URL, and a bundle of device and operating system (OS) metadata to the actor's console with a live "new visitor" entry before a single instruction has even been sent by the actor from the C2 server. Running alongside it is api/open/getSyncSettings, which pulls inbound configuration from the actor's server rather than exfiltrating anything, letting the actor change error messages, default contact placeholders, currency display, and other behavior on the fly without redeploying the client engine. For the victim’s environments where a persistent WebSocket connection is unavailable or blocked, api/open/pollInstruction provides an HTTP long poll fallback that delivers the same operator instruction objects the socket would otherwise push, keeping the actor's remote control functional even under restrictive network conditions. The session closes with api/open/the_final_interface, the client engine terminal exfiltration call. Once the actor issues a release instruction, the WebSocket connection and background worker are closed, and the entire accumulated cvvform object, every field collected across the full victim session — card data, identity documents, credentials, and fingerprint alike — is sent via HTTP POST to the C2 endpoint. 

The below table represents the endpoints and the purpose.  

Endpoint 

Purpose 

api/open/addclick 

Victim arrival beacon with fingerprinting data sent to C2 

api/open/getSyncSettings 

Gets actor-controlled settings from the C2 

api/open/the_final_interface 

POSTs the entire cvvform  exfiltration endpoint 

api/open/pollInstruction 

Gets the actor’s instructions from the C2 

api/open/addCvv 

Exfiltration endpoint 

The JWR client has purpose-built integrations for two major e-commerce platforms Shopify and WooCommerce. For Shopify deployments, the client reads the cart_data URL parameter which is a signed JSON blob that Shopify passes between checkout steps and extracts the checkout domain to use as the WebSocket base URL. This makes the WebSocket connection seem to originate from a legitimate Shopify domain. The initShopifyProductInfo() and initWordPressProductInfo() functions reconstruct the victim's shopping cart from the Shopify cart data, populating the phishing page with accurate product names, quantities, unit prices, and order totals making the fake checkout indistinguishable from the real one. 

Dissecting the JWR phishing framework
Figure 7. Shopify platform integration function of JWR client.

The operator facing status messages of the JWR framework are entirely written in Simplified Chinese and read as a professional admin dashboard notification feed phrases like "正在填写PayPal登录账号" (filling in PayPal login account), "进入2FA验证页, 请发送验证, 等待用户提交" (entering 2FA verification page, please send verification, waiting for user submission), and "均失败" (all failed), indicating that a Chinese-speaking actor is operating this scam campaign. 

Dissecting the JWR phishing framework
Figure 8. Deobfuscated view of JWR client’s program with hardcoded status messages in Simplified Chinese.

JWR phishing framework’s card stealing scenario 

When the victim lands on the fake page, their browser sends an arrival beacon, indicating to the actor that a new visitor is present. From there, the actor takes over, sending a to_info instruction that directs the victim to a personal details page. While the victim types, the actor sends no further instructions but monitors the data stream live. Once the actor has assessed the victim's personal information, they issue a to_card instruction, moving the victim to the card entry page, where the same stealth live streaming occurs as the card number is typed in digit by digit. 

If the actor isn't keen on the typed card details, tip_fail or tip_change_card instructions are sent, which deliver a fake "your card was declined" message to the victim and returns them to the card page to try a different one. This loop can repeat as many times as the actor wants, each attempt aimed at harvesting another card from the same victim. If the card is accepted instead, the operator sends one of the instructions: to_smsto_2fa, to_pin, or to_app, directing the victim to a verification page to confirm their identity with a one-time code. For the rejected code, the actor sends the tip_fail instruction, which prompts the victim to re-enter it, while an accepted one leads to the final instruction, to_success, which redirects the victim to the real website, concluding the session with the actor now having the victim’s data that was typed.  

Dissecting the JWR phishing framework
Figure 8. Payment card stealing scenario of the JWR client engine. 

The ongoing scam campaign  

Cisco Talos observed an attacker utilizing an SMS phishing technique, sending SMS related to toll or road-pricing fees, postal or courier fees lures that contain a malicious URL targeting potential victims. When victims click on the URL, it opens a fake webpage that executes embedded JavaScript, which then renders and loads the client-side JavaScript engine of the JWR phishing framework. 

Dissecting the JWR phishing framework
Dissecting the JWR phishing framework
Dissecting the JWR phishing framework

Figure 9. Sample SMS phishing messages. 

Dissecting the JWR phishing framework
Dissecting the JWR phishing framework

Figure 10. Phishing page which renders and loads the JWR client enabling the HOST mode. 

The victimology of this scam campaign illustrates a broad, multi-country SMS phishing (smishing) operation rather than a single targeted campaign. Most of the malicious URLs impersonate a national land transport authority and its vehicle services or road toll payment portal, consistent with an "unpaid toll or road pricing fine" lure in Singapore. A second set of malicious URLs impersonates a national postal service, aligned with a "parcel held pending a customs or delivery fee" lure, alongside a smaller cluster mimicking an electronic toll collection system in the UAE. The third set of URLs impersonates a regional courier brand utilized across several Southeast Asian countries, again centered around the undelivered parcel or cash on delivery fee theme. 

Talos discovery of the similarities in the client engine script of the JWR framework used in the current campaign with that of the Outsider PhaaS platform and additionally, we observed that in June 2026, the FBI had announced the technical takedown operation against Outsider platform (PhaaS) that has been in operation since 2023, through a joint operation “Ghost Hook.” However, the Outsider PhaaS was sold as a self-servicing product in the actor’s Telegram channels, according to the external researcher report, indicating the likely existence of variants of the Outsider PhaaS kit employed and operated by other Chinese-speaking threat actors.  

Comparing JWR with other Chinese PhaaS platforms 

Dissecting the JWR phishing framework
Figure 11. Comparison of a few features of Chinese PhaaS kits. 

Following the discovery of several similarities in the client-side scripts of the JWR and The Outsider kit, Talos conducted a comparative assessment of the JWR client script against other phishing kits operating within the Chinese-speaking criminal ecosystem. 

Talos found that JWR shares no code-level implementation with Lucid, Darcula, or Lighthouse. Its C2 communication protocol, encryption module, and message envelope are all independently engineered. At the behavioral level, JWR aligns closely with those kits. All four share the operational signature that defines this PhaaS lineage including live operator puppeteering, card capture paired with OTP/2FA interception, and multi-brand templating at scale. Several additional characteristics place JWR within the same family, highlighting a tradecraft consistency across the developers of the phishing kits embedded in the Chinese-speaking criminal ecosystem. 

Coverage 

The following ClamAV signature detects and blocks this threat:  

  • Js.Phishing.JwrFramework-10060456-0 

The following Snort2 and Snort3 (SIDs) rules detect and block this threat: 

  • 66924
  • 66925
  • 66926
  • 66927
  • 66928  

IOCs  

The IOCs for this threat are also available at our GitHub repository here. 



from Cisco Talos Blog https://ift.tt/JiQ0Mkr
via IFTTT