<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bhilal. Chitou</title>
    <description>The latest articles on DEV Community by Bhilal. Chitou (@7bhil).</description>
    <link>https://dev.to/7bhil</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3930883%2F7bbaaa09-6c61-4c98-8827-c9e9de03a076.jpeg</url>
      <title>DEV Community: Bhilal. Chitou</title>
      <link>https://dev.to/7bhil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/7bhil"/>
    <language>en</language>
    <item>
      <title>Building a Proactive Network Guardian: Deep Dive into Sentinelle (MIRAGE Project)</title>
      <dc:creator>Bhilal. Chitou</dc:creator>
      <pubDate>Thu, 04 Jun 2026 17:02:53 +0000</pubDate>
      <link>https://dev.to/7bhil/building-a-proactive-network-guardian-deep-dive-into-sentinelle-mirage-project-1cem</link>
      <guid>https://dev.to/7bhil/building-a-proactive-network-guardian-deep-dive-into-sentinelle-mirage-project-1cem</guid>
      <description>&lt;p&gt;Traditional network security often acts like a security camera: it records the "crime" (an intrusion) but doesn't stop it. By the time an administrator checks the logs, the data might already be exfiltrated.&lt;/p&gt;

&lt;p&gt;In the context of the &lt;strong&gt;MIRAGE Defense Platform&lt;/strong&gt;, I developed &lt;strong&gt;Sentinelle&lt;/strong&gt;—a module designed to move from passive logging to &lt;strong&gt;Active Response&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsw7wieflap3qlkyrka08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsw7wieflap3qlkyrka08.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is Sentinelle?
&lt;/h2&gt;

&lt;p&gt;Sentinelle is the "Guardian" of the MIRAGE ecosystem. It is a Python-based &lt;strong&gt;IDS/IPS (Intrusion Detection &amp;amp; Prevention System)&lt;/strong&gt; that performs deep packet inspection (DPI) and implements a graduated response to threats.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Python 3.12&lt;/strong&gt;: The core engine.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Scapy&lt;/strong&gt;: For packet sniffing, analysis, and forging.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Suricata Rules&lt;/strong&gt;: Leveraging the power of the Emerging Threats (ET) ruleset for signature matching.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;IPTables/Netfilter&lt;/strong&gt;: For real-time kernel-level isolation.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;p&gt;Sentinelle operates as a middleman between raw network traffic and the decision-making "Brain" (ORACLE).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    Traffic[Raw Network Traffic] --&amp;gt; Sniffer[Scapy Sniffer]
    Sniffer --&amp;gt; SigEngine[Signature Engine]
    Sniffer --&amp;gt; DNSGuard[DNS Guard]

    SigEngine -- Alert --&amp;gt; Logic{Response Logic}
    DNSGuard -- Malware Domain --&amp;gt; Logic

    Logic --&amp;gt;|Block| IPTables[IPTables Isolation]
    Logic --&amp;gt;|Kill| TCPReset[TCP Reset Attack]
    Logic --&amp;gt;|Report| Oracle[Oracle Orchestrator]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Deep Packet Inspection (DPI)
&lt;/h3&gt;

&lt;p&gt;Sentinelle doesn't just look at headers; it inspects the payload. Using &lt;strong&gt;Scapy&lt;/strong&gt;, it can identify patterns characteristic of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  SQL Injection attempts.&lt;/li&gt;
&lt;li&gt;  SSH/FTP Brute-forcing.&lt;/li&gt;
&lt;li&gt;  Scanning tools signatures (Nmap, ZMap).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. DNS Guard: Killing C2 Channels
&lt;/h3&gt;

&lt;p&gt;One of the most effective ways to stop malware is to break its "phone home" capability. Sentinelle acts as a transparent watcher on DNS traffic. If a local machine attempts to resolve a domain flagged by Threat Intelligence (like &lt;strong&gt;URLhaus&lt;/strong&gt;), Sentinelle intercepts the request and blocks the resolution before the connection can even start.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Tiered Mitigation (The Escalation Logic)
&lt;/h3&gt;

&lt;p&gt;Not every alert requires a total shutdown. Sentinelle implements a graduated response:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Level 1 (Info)&lt;/strong&gt;: Log locally and monitor.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Level 2 (Warning)&lt;/strong&gt;: Throttling bandwidth for the suspicious IP.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Level 3 (Critical)&lt;/strong&gt;: Immediate isolation via IPTables and triggering the &lt;strong&gt;GHOST&lt;/strong&gt; module (redirecting the attacker to a honeypot).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. TCP Reset Counter-Attacks
&lt;/h3&gt;

&lt;p&gt;For high-priority threats, Sentinelle can forge &lt;strong&gt;TCP RST&lt;/strong&gt; packets. This effectively "kills" a connection on both ends without needing complex firewall rules, providing an instantaneous stop to an ongoing attack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code Spotlight: The Sniffer Loop
&lt;/h2&gt;

&lt;p&gt;Here is a simplified look at how Sentinelle processes traffic. This loop is non-blocking and handles packets at high speed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scapy.all&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sniff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sentinelle.logic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SignatureEngine&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;guardian_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eth0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[*] Sentinelle active on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# We use a BPF filter to capture only IP traffic
&lt;/span&gt;    &lt;span class="nf"&gt;sniff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="n"&gt;prn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;process_packet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_packet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;haslayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Pass the packet to our signature engine
&lt;/span&gt;        &lt;span class="n"&gt;threat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SignatureEngine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;threat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_critical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Drop the connection immediately
&lt;/span&gt;            &lt;span class="nf"&gt;mitigate_threat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[!] Blocked critical threat from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mitigate_threat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Forging a TCP Reset packet
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;haslayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;rst_pkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;R&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_pkt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;Building a real-time defense system in Python comes with challenges, primarily around performance. To overcome this, Sentinelle uses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Standardized Events&lt;/strong&gt;: All modules communicate via &lt;strong&gt;MirageEvent&lt;/strong&gt; (JSON), ensuring interoperability.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Multiprocessing&lt;/strong&gt;: Offloading heavy analysis to separate cores.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Kernel Integration&lt;/strong&gt;: Using Python to &lt;em&gt;decide&lt;/em&gt; and IPTables to &lt;em&gt;execute&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The next phase for Sentinelle involves &lt;strong&gt;eBPF integration&lt;/strong&gt; to move packet filtering even deeper into the Linux kernel for near-zero latency.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Are you building security tools with Python?&lt;/strong&gt; I'd love to hear your thoughts on automated mitigation vs. manual intervention in the comments!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Find the project on &lt;a href="https://github.com/7Bhil/sentinelle" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | Connect with me on &lt;a href="https://linkedin.com/in/7Bhil" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  python #cybersecurity #networking #devops #opensourcepython, #7Bhil, #Bhildollars
&lt;/h1&gt;

</description>
      <category>python</category>
      <category>cybersecurity</category>
      <category>networking</category>
      <category>devops</category>
    </item>
    <item>
      <title>Technical Reference Manual: SCAN Module (MIRAGE)</title>
      <dc:creator>Bhilal. Chitou</dc:creator>
      <pubDate>Thu, 28 May 2026 12:15:00 +0000</pubDate>
      <link>https://dev.to/7bhil/technical-reference-manual-scan-module-mirage-38nj</link>
      <guid>https://dev.to/7bhil/technical-reference-manual-scan-module-mirage-38nj</guid>
      <description>&lt;p&gt;This document serves as the technical guide for the SCAN module. It is designed to provide a comprehensive understanding of the component's inner workings, implementation details, and defensive capabilities for technical presentations and architectural reviews.&lt;/p&gt;




&lt;h2&gt;
  
  
  Module Philosophy
&lt;/h2&gt;

&lt;p&gt;The SCAN module is fundamentally designed as an &lt;strong&gt;Autonomous Diagnostic Expert System&lt;/strong&gt; rather than a traditional, passive network scanner. Its primary objective is to evaluate target infrastructures by adopting an offensive reconnaissance posture, quantifying security risks through predefined metrics, and executing immediate mitigations or hotfixes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxwkumr1cygwn8o2jix0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxwkumr1cygwn8o2jix0.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal Architecture and Component Workflow
&lt;/h2&gt;

&lt;p&gt;The codebase is structured into specialized python scripts, executing sequentially to form an automated assessment pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ discovery.py ] ──(IPs/MAC)──&amp;gt; [ port_scanner.py ] ──(Services)──&amp;gt; [ vulnerability_scanner.py ]
                                                                             │
[ auto_patcher.py ] &amp;lt;──(Mitigation Order)── [ resolution_engine.py ] &amp;lt;──────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Network Discovery — &lt;code&gt;discovery.py&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mechanism:&lt;/strong&gt; Maps the local area network (LAN) topology by broadcasting raw Address Resolution Protocol (ARP) requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation Details:&lt;/strong&gt; Leverages the &lt;strong&gt;Scapy&lt;/strong&gt; library to forge custom network packets from scratch. Unlike standard ICMP ping requests, which are frequently dropped or restricted by modern host-based firewalls, ARP resolution is technically mandatory for local subnet communications. This architectural choice makes the discovery phase resilient against standard stealth configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collected Data:&lt;/strong&gt; Target IP addresses, MAC addresses, and resolved hostnames.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Surface Reconnaissance — &lt;code&gt;port_scanner.py&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mechanism:&lt;/strong&gt; Probes designated network interfaces to identify active listener ports and available attack surfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Engine:&lt;/strong&gt; Integrates the &lt;strong&gt;OWASP Nettacker&lt;/strong&gt; framework to ensure industrial-grade reliability, multi-threading capabilities, and native JSON output formatting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; A structured mapping of open ports associated with their respective network transport protocols and services (e.g., HTTP on port 80, SSH on port 22).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Vulnerability Assessment — &lt;code&gt;vulnerability_scanner.py&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mechanism:&lt;/strong&gt; Inspects the application layer of identified open services to detect known misconfigurations and software flaws.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Targeted Checks:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Software Version Heuristics:&lt;/strong&gt; Banner grabbing to identify outdated software components exposed to known CVEs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information Disclosure:&lt;/strong&gt; Scanning for orphaned repositories, exposed metadata, or backup files (e.g., &lt;code&gt;.git&lt;/code&gt; directories, &lt;code&gt;backup.zip&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Application Flaws:&lt;/strong&gt; Verifying the absence of essential security headers, such as anti-clickjacking directives.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Resolution Engine &amp;amp; Scoring Matrix — &lt;code&gt;resolution_engine.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This component serves as the core algorithmic decision layer of the pipeline.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expert System Knowledge Base:&lt;/strong&gt; Utilizes a static dictionnaire (&lt;code&gt;RESOLUTION_GUIDES&lt;/code&gt;) that maps specific vulnerability signatures to explicit technical remediation scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail-Safe Mechanism (Generic Alerting):&lt;/strong&gt; In the event that the scanner encounters an undocumented or highly specialized flaw, the pipeline handles the exception without crashing. It generates a Generic Alert that enforces system logging and prompts administrative intervention, ensuring no anomaly goes unnoticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quantitative Scoring Algorithm:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Each target host initializes with a baseline security posture score of &lt;strong&gt;100&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Deductions are dynamically calculated and subtracted from the total based on the CVSS-aligned severity of discovered vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Posture Classifications:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safe (&amp;gt;80):&lt;/strong&gt; Healthy security posture; low risk profile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At Risk (50-80):&lt;/strong&gt; Noticeable configuration drifts; remediation required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical (&amp;lt;50):&lt;/strong&gt; Immediate risk of system compromise or intrusion.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Automated Remediation — &lt;code&gt;auto_patcher.py&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mechanism:&lt;/strong&gt; Operates as an automated maintenance agent to enforce immediate threat mitigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concrete Operations:&lt;/strong&gt; Programmatically modifies local service configurations (e.g., hardening encryption parameters within &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;) and injects strict access control rules into the Uncomplicated Firewall (UFW) subsystem to apply the principle of least privilege.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xgg2aobrmpz5ca7qzhu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xgg2aobrmpz5ca7qzhu.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Subsystem Interactions: SCAN vs SENTINELLE
&lt;/h2&gt;

&lt;p&gt;The table below outlines the operational boundaries and synergies between the proactive assessment layer (SCAN) and the reactive monitoring layer (SENTINELLE):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operational Metric&lt;/th&gt;
&lt;th&gt;SCAN Module&lt;/th&gt;
&lt;th&gt;SENTINELLE Module&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operational Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proactive (Audit &amp;amp; Hardening)&lt;/td&gt;
&lt;td&gt;Reactive (Detection &amp;amp; Blocking)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Temporal Layout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execution via cron scheduling or manual trigger.&lt;/td&gt;
&lt;td&gt;Continuous background daemon execution (Real-time).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Port Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identifies open ports and restricts unauthorized ones.&lt;/td&gt;
&lt;td&gt;Monitors inbound connections to detect external port scans.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System Analogy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An inspector verifying physical structural integrity.&lt;/td&gt;
&lt;td&gt;A security guard and motion sensor monitoring access.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Operational Synergy:&lt;/strong&gt; If the SCAN module leaves a port open to accommodate specific business requirements, the SENTINELLE module monitors traffic anomalies on that vector. If unauthorized or malicious activity occurs, SENTINELLE isolates the threat vector and blocks the source IP address immediately.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Technical Design Decisions &amp;amp; Defensive FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why implement OWASP Nettacker over Nmap?
&lt;/h3&gt;

&lt;p&gt;While Nmap remains an industry standard for raw network discovery and packet-level manipulation, Nettacker is natively structured around vulnerability assessment workflows. Its plugin architecture and modular JSON outputs integrate seamlessly with a centralized cloud database, simplifying data parsing for the resolution engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the operational risks of automated patching?
&lt;/h3&gt;

&lt;p&gt;Automated patching introduces risks regarding service availability and configuration regression. To mitigate this, the feature can be toggled by the system administrator. However, on critical or highly exposed infrastructures, automating remediation significantly decreases the window of exposure—the time elapsed between vulnerability discovery and patch deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does the SCAN module patch remote hosts without inbound SSH access?
&lt;/h3&gt;

&lt;p&gt;MIRAGE utilizes a decoupled, asynchronous messaging architecture. When the SCAN module identifies a vulnerability on a remote host, it does not connect directly to the target machine. Instead, it publishes the diagnostic report and a standardized remediation order to a central cloud instance (&lt;strong&gt;MongoDB Atlas&lt;/strong&gt;). The remote target runs a local SENTINELLE agent that maintains an outbound connection to this database cluster. Upon receiving the JSON-encoded command, the local agent executes the instructions natively via its own &lt;code&gt;auto_patcher.py&lt;/code&gt; script. This eliminates the requirement to expose administrative management ports to the network.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>devops</category>
      <category>python</category>
    </item>
    <item>
      <title># The 3 AM Epiphany: How a Hacking Video Saved My FinTech App From a Rookie Mistake</title>
      <dc:creator>Bhilal. Chitou</dc:creator>
      <pubDate>Sun, 24 May 2026 10:25:36 +0000</pubDate>
      <link>https://dev.to/7bhil/-the-3-am-epiphany-how-a-hacking-video-saved-my-fintech-app-from-a-rookie-mistake-2hjk</link>
      <guid>https://dev.to/7bhil/-the-3-am-epiphany-how-a-hacking-video-saved-my-fintech-app-from-a-rookie-mistake-2hjk</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;We’ve all been there. It’s the middle of the night, you’re fast asleep, and suddenly your brain snaps awake because you realized you left a massive vulnerability in your code. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt79mtbczcogg3f4hvz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt79mtbczcogg3f4hvz4.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few days ago, I was watching a live-streamed web hacking session. It was fascinating to analyze the entire spectacle as an ethical hacker meticulously uncovered and exploited one vulnerability after another, breaking down the application's defense layer by layer. &lt;/p&gt;

&lt;p&gt;I went to bed thinking about it, but mid-sleep, panic set in. My brain connected the dots, and I remembered a rookie mistake I had made about two weeks ago on one of my own active projects—the exact same flaw highlighted in that video.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Midnight Race Against the Clock
&lt;/h2&gt;

&lt;p&gt;Driven by pure adrenaline and precipitation, I jumped out of bed, fired up my IDE, and started scrambling to fix the issue. When you are building software, especially in the financial space, security isn't just an afterthought—it's the core foundation. &lt;/p&gt;

&lt;p&gt;But as I dove into the codebase to implement a patch, I stumbled upon a pleasant surprise: I had already fixed the vulnerability days ago without even consciously realizing it. Past-me had looked at the code, refactored it cleanly, and patched the loophole as part of a routine update. The relief was indescribable, but it taught me a valuable lesson about how deeply security practices embed themselves into your muscle memory when you train your mind to think like an attacker.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Am I Building? (The Vision)
&lt;/h2&gt;

&lt;p&gt;For those wondering what this project actually is: I am building a FinTech infrastructure designed to make transferring money seamless, lightning-fast, and, most importantly, with significantly lower transaction fees than current mainstream options. &lt;/p&gt;

&lt;p&gt;Security, high performance, and accessibility are the pillars of this platform. You can check out the current deployment here: &lt;a href="https://vitch.vercel.app/" rel="noopener noreferrer"&gt;https://vitch.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Admin Dashboard Discovery
&lt;/h2&gt;

&lt;p&gt;While investigating and securing the platform, I also checked the administration dashboard and noticed some highly suspicious activity: multiple unrecognized accounts had already been created, including two specific "pentest" accounts and an unauthorized "admin users" account. &lt;/p&gt;

&lt;p&gt;This reinforces my commitment to absolute transparency and aggressive security hardening. Because of this, I am actively encouraging anyone in the cybersecurity community—pentesters, bug hunters, and security engineers—to audit the platform. If you can find a vulnerability, bypass my defenses, or spot a flaw in my architecture, I want to know about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning Panic into Evolution: Integrating Crypto?
&lt;/h2&gt;

&lt;p&gt;Waking up to think about security also made me rethink the entire architecture of the project. As I sat there looking at my system design, a new idea sparked: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I integrated a dedicated cryptocurrency or token framework into this ecosystem?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Leveraging a digital currency layer could potentially bypass traditional banking rails entirely, dropping transaction fees even lower, ensuring near-instant cross-border settlements, and adding an extra layer of decentralized security.&lt;/p&gt;

&lt;h2&gt;
  
  
  Over to You: Let’s Discuss!
&lt;/h2&gt;

&lt;p&gt;Before I write the next line of code for this feature, I want to hear from the community:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have you ever had a "3 AM security panic" that turned out to be a false alarm (or a real one)?&lt;/li&gt;
&lt;li&gt;If you were building a low-cost FinTech transfer system today, would you rely strictly on optimized Web2 fiat APIs, or would you bridge it with a Web3/Crypto infrastructure? What are the biggest regulatory or architectural roadblocks you've faced with hybrid systems?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m eager to hear your thoughts, advice, and critiques. You can explore, audit, and test the platform directly at &lt;a href="https://vitch.vercel.app/" rel="noopener noreferrer"&gt;https://vitch.vercel.app/&lt;/a&gt; — let's see what you can find and let's build secure things together.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comment j’ai survécu au développement d'une app de messagerie totalement chiffrée en React Native"</title>
      <dc:creator>Bhilal. Chitou</dc:creator>
      <pubDate>Sat, 16 May 2026 19:36:25 +0000</pubDate>
      <link>https://dev.to/7bhil/comment-jai-survecu-au-developpement-dune-app-de-messagerie-totalement-chiffree-en-react-native-943</link>
      <guid>https://dev.to/7bhil/comment-jai-survecu-au-developpement-dune-app-de-messagerie-totalement-chiffree-en-react-native-943</guid>
      <description>&lt;p&gt;Aujourd'hui, tout le monde veut créer la prochaine alternative à WhatsApp, Signal ou Telegram. Sécurisée, chiffrée de bout en bout (E2EE), légère, infaillible.&lt;/p&gt;

&lt;p&gt;Quand j'ai décidé de construire l'application de messagerie &lt;strong&gt;Anonyme&lt;/strong&gt; en utilisant &lt;strong&gt;React Native (Expo)&lt;/strong&gt; et &lt;strong&gt;Supabase&lt;/strong&gt;, je me suis dit : &lt;em&gt;"Combien est-ce que ça peut être difficile ? On génère deux clés, on chiffre, on envoie sur des WebSockets, on déchiffre. Terminé."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczqup442tgtyrwwncebd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczqup442tgtyrwwncebd.png" alt=" " width="720" height="977"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais la cryptographie dans l'écosystème mobile JavaScript... c'est une autre paire de manches. Entre l'asynchronie capricieuse et les limites des outils de dev, voici comment cette architecture, théoriquement simple, a failli me rendre fou.&lt;/p&gt;




&lt;h3&gt;
  
  
  L'Échec de l'Algorithme Maison &amp;amp; L'Enfer d'Expo Go
&lt;/h3&gt;

&lt;p&gt;L'histoire commence bien avant les premières lignes de code. Cela faisait un an que je réfléchissais à un algorithme de chiffrement personnalisé avec un camarade. Le plan était parfait sur le papier. Mais dès qu'on l'a intégré au projet mobile : &lt;strong&gt;black-out&lt;/strong&gt;. Le déchiffrement refusait catégoriquement de fonctionner.&lt;/p&gt;

&lt;p&gt;Pendant une semaine complète, j'ai revu mes calculs mathématiques, retourné le code dans tous les sens... en vain. Pour couronner le tout, à force de recharger l'application pour tester mes modifications algorithmiques, &lt;strong&gt;j'ai totalement épuisé ma limite d'utilisation sur Expo Go.&lt;/strong&gt; Bloqué au milieu du tunnel.&lt;/p&gt;

&lt;p&gt;J'ai dû me rendre à l'évidence : pour avancer, il fallait temporairement laisser tomber notre algo maison et basculer sur des standards plus basiques (comme X25519 avec TweetNaCl.js). Mais ce n'est que partie remise, ça finira par fonctionner.&lt;/p&gt;

&lt;p&gt;Cette frustration m'a poussé à une réflexion cruciale : &lt;strong&gt;la sécurité d'une application ne dépend pas uniquement de la complexité de son algorithme de chiffrement.&lt;/strong&gt; J'ai donc réorienté mon énergie vers des fonctionnalités de sécurité terrain massives pour blinder l'application.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Le Cauchemar du TextEncoder Manquant
&lt;/h3&gt;

&lt;p&gt;En cryptographie standard, tout fonctionne avec des tableaux d'octets (&lt;code&gt;Uint8Array&lt;/code&gt;). Ton mot de passe ? &lt;code&gt;Uint8Array&lt;/code&gt;. Ton message secret "Salut !" ? &lt;code&gt;Uint8Array&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour passer d'une chaîne de texte JavaScript vers un &lt;code&gt;Uint8Array&lt;/code&gt;, tous les navigateurs utilisent &lt;code&gt;TextEncoder&lt;/code&gt;. Le problème ? &lt;strong&gt;React Native ne possède pas de &lt;code&gt;TextEncoder&lt;/code&gt; ou &lt;code&gt;TextDecoder&lt;/code&gt; natif en V8/JSC.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je me retrouvais face à des écrans rouges explosifs à chaque tentative de chiffrement car l'application ne savait pas comment convertir des strings JavaScript. J'ai dû implémenter le polyfill &lt;code&gt;text-encoding-polyfill&lt;/code&gt; au sommet de l'arbre d'exécution (&lt;code&gt;_layout.tsx&lt;/code&gt;) juste pour forcer l'environnement mobile à lire de simples phrases :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-get-random-values&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-encoding-polyfill&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Le Base64 : Un Espion Infiltré
&lt;/h3&gt;

&lt;p&gt;Une fois les données chiffrées, il fallait bien envoyer ces bits illisibles via Supabase. La méthode classique : encoder le &lt;code&gt;Uint8Array&lt;/code&gt; chiffré en &lt;strong&gt;Base64&lt;/strong&gt; dans une base Postgres.&lt;/p&gt;

&lt;p&gt;Mais au moment de récupérer les messages via les requêtes temps-réel (&lt;code&gt;subscribe&lt;/code&gt;) de Supabase, mes boîtes de dialogue affichaient... un &lt;code&gt;null&lt;/code&gt; massif.&lt;/p&gt;

&lt;p&gt;Pourquoi ? L'encodage &lt;strong&gt;Base64&lt;/strong&gt; n'est pas un standard si universel. Des caractères générés par certaines librairies venaient corrompre la vérification de longueur de &lt;code&gt;TweetNaCl&lt;/code&gt;. J'ai été forcé d'ajouter une couche de nettoyage draconienne et une stricte validation d’encodage via le module &lt;code&gt;buffer&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanBase64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/-/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/_/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="sr"&gt;s/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decodedData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cleanBase64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encrypted_content&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. La Base de Données Éphémère &amp;amp; "Tu ne supprimeras point"
&lt;/h3&gt;

&lt;p&gt;Pour pousser le concept "Zéro Trace" à l'extrême, j'ai configuré la base de données pour qu'elle agisse comme une simple boîte aux lettres : &lt;strong&gt;le serveur ne stocke le message chiffré que si le destinataire est hors ligne.&lt;/strong&gt; Dès que le client est connecté, récupère le payload et le déchiffre localement, l'application exécute un &lt;code&gt;supabase.delete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;C'est là que le Row Level Security (RLS) de Supabase est entré en guerre contre moi. Les règles de sécurité serveur empêchaient silencieusement l’utilisateur de déclencher l'action &lt;code&gt;DELETE&lt;/code&gt; sur les lignes qui ne lui appartenaient pas "strictement" en droit total. La fonction échouait sans crasher, gardant le flag &lt;code&gt;is_read = false&lt;/code&gt; sur le serveur et faisant s'emballer mon compteur de messages non-lus sur l'accueil.&lt;/p&gt;

&lt;h4&gt;
  
  
  La Solution Architecturale :
&lt;/h4&gt;

&lt;p&gt;N'ayant pas de contrôle total sur le Back-End du cloud, j'ai appliqué une double stratégie :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;La rustine serveur :&lt;/strong&gt; Un &lt;code&gt;supabase.update({is_read: true})&lt;/code&gt; pour contourner la barrière du Delete total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La timeline locale :&lt;/strong&gt; J'ai utilisé &lt;code&gt;AsyncStorage&lt;/code&gt; pour sauvegarder la milliseconde précise de fermeture d'un chat (&lt;code&gt;last_opened_chat&lt;/code&gt;). L'application filtre désormais d'elle-même : si un message sur le serveur est daté d'avant cette marque temporelle, il est considéré comme consommé et ignoré, peu importe l'état du flag sur le serveur.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  4. Chronomètres Éphémères et Décalage Spatio-Temporel
&lt;/h3&gt;

&lt;p&gt;Je voulais intégrer un mode "Message Éphémère" avec un délai d'auto-suppression personnalisable (par exemple 30 secondes), digne de la NSA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Première version :&lt;/strong&gt; J'insérais la limite sur le serveur au moment de l'envoi (&lt;code&gt;created_at + 30s&lt;/code&gt;). Résultat catastrophique : si le destinataire n'ouvrait pas l'app pendant une minute, le message périssait sur le serveur avant même d'arriver sur son téléphone ! Pire : si l'expéditeur se déconnectait, il perdait son propre historique car le chronomètre avait enterré le message à distance.&lt;/p&gt;

&lt;p&gt;J'ai totalement modifié la chorégraphie du minuteur. Le temps ne doit pas s'écouler pendant le voyage ; il ne s'active &lt;strong&gt;qu'à destination&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expirySeconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Le chronomètre ne commence... EXACTEMENT MAINTENANT chez le destinataire.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;localExpiresAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;expirySeconds&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le serveur n'a aucune idée de la "Date Limite". C'est conféré dans le payload sécurisé transféré au destinataire. Le message attend sagement, et explose sous les yeux de l'utilisateur 30 secondes après l'ouverture.&lt;/p&gt;




&lt;h3&gt;
  
  
  Le Blindage Final : Zéro Capture d'Écran
&lt;/h3&gt;

&lt;p&gt;Pour parfaire cette suite de sécurité, il restait une faille humaine : la capture d'écran. Chiffrer de bout en bout ne sert à rien si l'utilisateur peut photographier la discussion.&lt;/p&gt;

&lt;p&gt;J'ai intégré des modules natifs pour bloquer instantanément toute tentative de screenshot ou d'enregistrement vidéo dès qu'on entre dans l'écran de discussion. Sur Android, l'application force le système à retourner un écran noir complet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Construire un système &lt;em&gt;End-To-End Encrypted&lt;/em&gt; va bien au-delà de la simple théorie mathématique. C'est affronter les décalages de synchro des bases de données temps réel, débugger les lacunes du moteur JavaScript de React Native sur des modules noyaux comme Buffer, et réajuster ses ambitions quand l'environnement de dev lâche prise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F025t9jtgi6tchuy6qy4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F025t9jtgi6tchuy6qy4o.png" alt=" " width="599" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais à la fin, quand tes requêtes passent, que les clignotants de l'authentification asymétrique passent au vert et que ton système est scellé ?&lt;/p&gt;

&lt;p&gt;C'est là que réside toute la beauté de l'ingénierie logicielle.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(N'hésitez pas à me suivre, d'autres aventures de debugs brutaux arrivent bientôt !)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>supabase</category>
      <category>cryptography</category>
      <category>bhildollars</category>
    </item>
    <item>
      <title>Introduction to Bhilal: A Hybrid Language for Developers and Security Researchers</title>
      <dc:creator>Bhilal. Chitou</dc:creator>
      <pubDate>Fri, 15 May 2026 10:25:54 +0000</pubDate>
      <link>https://dev.to/7bhil/introduction-to-bhilal-a-hybrid-language-for-developers-and-security-researchers-4hb3</link>
      <guid>https://dev.to/7bhil/introduction-to-bhilal-a-hybrid-language-for-developers-and-security-researchers-4hb3</guid>
      <description>&lt;p&gt;Bhilal is a modern, object-oriented programming language designed to streamline the creation of security tools. It combines a user-friendly syntax with a powerful hybrid engine to bridge&lt;br&gt;
  the gap between high-level scripting and low-level network auditing.&lt;/p&gt;

&lt;p&gt;The Architecture: Node.js meets Go&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6yme9vulurlkt7zn0kw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6yme9vulurlkt7zn0kw.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core of Bhilal is built on a hybrid architecture. While the lexer, parser, and high-level logic are handled by Node.js for maximum flexibility, the security-critical modules are&lt;br&gt;
  powered by Go. This allows the language to perform multi-threaded tasks, such as port scanning and DNS brute forcing, with native performance.&lt;/p&gt;

&lt;p&gt;Key Technical Features&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Localized Syntax: Bhilal uses French keywords (soit, montre, si, tantque, classe) making it a unique entry in the world of specialized languages.&lt;/li&gt;
&lt;li&gt;Built-in Security Arsenal: Unlike general-purpose languages, Bhilal includes native functions for penetration testing:

&lt;ul&gt;
&lt;li&gt;scan_ports(host, ports)&lt;/li&gt;
&lt;li&gt;dirbuster(url)&lt;/li&gt;
&lt;li&gt;dns_resolve(hostname)&lt;/li&gt;
&lt;li&gt;subnet_scan(cidr)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Full OOP Implementation: It supports classes, inheritance, and clean object instantiation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quick Code Example&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 # Simple security audit script
2 montre("Starting network analysis...")
3 soit target = "127.0.0.1"
4 soit results = scan_ports(target, [22, 80, 443, 3306])
5
6 pour chaque res dans results {
7     si res.open {
8         montre("Found open port: " + res.port)
9     }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Resources and Installation&lt;/p&gt;

&lt;p&gt;Bhilal can be installed globally via npm:&lt;br&gt;
  npm install -g bhilal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official Documentation: &lt;a href="https://bhil-documentations.netlify.app/" rel="noopener noreferrer"&gt;https://bhil-documentations.netlify.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source Code: &lt;a href="https://github.com/7Bhil/Language-Bhilal" rel="noopener noreferrer"&gt;https://github.com/7Bhil/Language-Bhilal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bhilal is an open-source project. We are looking for contributors to help expand the standard library and the Go-based security modules.&lt;/p&gt;

</description>
      <category>node</category>
      <category>programming</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I built a Virtual Currency Wallet with NestJS &amp; Next.js (Beta out!) The "500 Million" Surprise</title>
      <dc:creator>Bhilal. Chitou</dc:creator>
      <pubDate>Thu, 14 May 2026 12:54:59 +0000</pubDate>
      <link>https://dev.to/7bhil/how-i-built-a-virtual-currency-wallet-with-nestjs-nextjs-beta-outthe-500-million-surprise-3aji</link>
      <guid>https://dev.to/7bhil/how-i-built-a-virtual-currency-wallet-with-nestjs-nextjs-beta-outthe-500-million-surprise-3aji</guid>
      <description>&lt;p&gt;A few days ago, I looked at my account and saw 500 million. No, I didn't hack a bank. It’s Vitch, my latest Fintech project, and the beta is officially live!&lt;br&gt;
What is Vitch?&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad1yt1uptkm50wat73b1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad1yt1uptkm50wat73b1.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vitch is a virtual currency platform designed for scalability. To make the onboarding fun, every new user automatically receives a welcome bonus (500 FCFA, 1€, or 1$ depending on their geographical location) upon registration.&lt;br&gt;
The Tech Stack&lt;/p&gt;

&lt;p&gt;I wanted to build something robust and secure, so I chose a modern fullstack architecture:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backend: NestJS (Node.js) for a structured and scalable API.

Frontend: Next.js / React for a fast and SEO-friendly interface.

Styling: Tailwind CSS (aiming for a minimalist/modern UI).

Deployment: Vercel (for that sweet global CDN and speed).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F840jvrrdkhju3izmhkv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F840jvrrdkhju3izmhkv9.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I learned&lt;/p&gt;

&lt;p&gt;Building a fintech app from scratch is addictive. You have to think about currency logic, secure authentication, and real-time balance updates. There’s nothing like the feeling of seeing the transaction logic work perfectly for the first time.&lt;br&gt;
I need your Brutal Honesty&lt;/p&gt;

&lt;p&gt;I'm sharing this with the Dev.to community because I don't want compliments; I want to improve.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UX/UI: How does the flow feel? (A fellow dev already suggested adding Google Auth, which is on my roadmap!).

Security: Pentesters, feel free to poke around.

Logic: Is the virtual wallet architecture sound?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Live Demo: vitch.vercel.app&lt;br&gt;
Open Source&lt;/p&gt;

&lt;p&gt;I believe in "Building in Public". If you are working on a similar wallet idea, don't start from zero. You can check my repositories here:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend (Next.js): 7Bhil/wallet-next

Backend (NestJS): 7Bhil/wallet-nest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Let's discuss in the comments! Are you working on any Fintech projects lately?&lt;/p&gt;

&lt;h1&gt;
  
  
  showdev #webdev #fintech #opensource #javascript
&lt;/h1&gt;

</description>
    </item>
  </channel>
</rss>
