<?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>Forem: Srichinmai Sripathi</title>
    <description>The latest articles on Forem by Srichinmai Sripathi (@chinmai_sri).</description>
    <link>https://forem.com/chinmai_sri</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%2F3927912%2Ffedb15b2-df07-4267-8e3f-022a87e8a0ce.png</url>
      <title>Forem: Srichinmai Sripathi</title>
      <link>https://forem.com/chinmai_sri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/chinmai_sri"/>
    <language>en</language>
    <item>
      <title>How We Bypassed OTP Rate Limits via IP Rotation on a Major Streaming Platform</title>
      <dc:creator>Srichinmai Sripathi</dc:creator>
      <pubDate>Fri, 22 May 2026 19:59:07 +0000</pubDate>
      <link>https://forem.com/chinmai_sri/how-we-bypassed-otp-rate-limits-via-ip-rotation-on-a-major-streaming-platform-32oh</link>
      <guid>https://forem.com/chinmai_sri/how-we-bypassed-otp-rate-limits-via-ip-rotation-on-a-major-streaming-platform-32oh</guid>
      <description>&lt;p&gt;At our engineering team, we have been building an autonomous browser agent that navigates the web to test checkout and subscription flows. Recently, we pointed our test runner at a major subscription video streaming platform to analyze how it handled user authentication.&lt;/p&gt;

&lt;p&gt;What started as a routine crawler testing run ended in the discovery of two significant API vulnerabilities: a High-severity Account Takeover (ATO) via OTP brute forcing and a Medium-severity SMS Flooding/DoS vulnerability.&lt;/p&gt;

&lt;p&gt;Here is the step-by-step breakdown of how we intercepted the auth flow, reverse-engineered the rate-limiting rules, and proved that a simple IP rotation completely bypasses the platform's defenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Intercepting the Auth Flow
&lt;/h2&gt;

&lt;p&gt;Because the service is a subscription streaming platform, user registration is required before arriving at any checkout screen. To understand how they authorize users, we used a Playwright network interception script to capture traffic during a standard login attempt.&lt;/p&gt;

&lt;p&gt;We uncovered a 4-step API chain pointing to their authentication service:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Guest Registration: POST /api/v1/user/guest/register returns an anonymous session ID.&lt;/li&gt;
&lt;li&gt;OTP Generation: POST /api/v1/user/auth/generateOTP triggers a 4-digit OTP code sent to the mobile number.&lt;/li&gt;
&lt;li&gt;OTP Validation: POST /api/v1/user/auth/validateOTP validates the code.&lt;/li&gt;
&lt;li&gt;Subscription Status: POST /api/v1/subscription/current pulls the active subscription details.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Reverse-Engineering the Rate Limiter
&lt;/h2&gt;

&lt;p&gt;Once we mapped the API, we wrote a script to stress-test the rate limits on both the OTP generation and validation endpoints. We ran three scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scenario A: Brute-force wrong OTP codes to measure the validation lockout threshold.&lt;/li&gt;
&lt;li&gt;Scenario B: Spam the resend OTP endpoint to measure the generation lockout threshold.&lt;/li&gt;
&lt;li&gt;Scenario C (Identity Bypass): Rotate the session identifiers (deviceId and session tokens) while keeping the same source IP to see if the counter resets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validation Limit: The API allowed 5 incorrect attempts before returning an HTTP 429 API rate limit exceeded message with a variable retry-after cooldown (between 10s to 20s).&lt;/li&gt;
&lt;li&gt;Generation Limit: The API allowed 5 SMS requests before lockout, but with a tiny 3-second cooldown.&lt;/li&gt;
&lt;li&gt;Identity Bypass: Rotating session-specific device IDs did not bypass the limit. The API gateway successfully tracked requests by the client's source IP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this IP-only protection introduced a massive vulnerability.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Vulnerability: Account Takeover (ATO)
&lt;/h2&gt;

&lt;p&gt;Because the rate limit is tied solely to the client IP address and not to the target phone number, the system is highly vulnerable to distributed brute-forcing.&lt;/p&gt;

&lt;p&gt;The platform uses a 4-digit OTP (only 10,000 possible combinations, from 0000 to 9999). If a malicious actor wants to compromise a specific phone number, they don't need to bypass the IP rate limit—they just need to rotate their IP.&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%2F8t1nnqkuk31ggkqv0af6.jpg" 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%2F8t1nnqkuk31ggkqv0af6.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Math:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lockout rate: 5 attempts per IP before a temporary block.&lt;/li&gt;
&lt;li&gt;Evasion: By rotating requests through a residential proxy pool of 100 IPs, an attacker can execute 500 attempts every 20 seconds.&lt;/li&gt;
&lt;li&gt;Time to Compromise: $$\frac{10,000 \text{ combinations}}{1,500 \text{ attempts/minute}} \approx 6.6 \text{ minutes}$$&lt;/li&gt;
&lt;li&gt;Cost: Extremely low cost for residential proxy bandwidth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Within 7 minutes, an attacker can exhaust the entire keyspace, validate the correct OTP, and gain a valid authentication token for any registered phone number.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. SMS Flooding &amp;amp; Denial of Service
&lt;/h2&gt;

&lt;p&gt;Similarly, the 3-second cooldown on the /generateOTP endpoint is trivial to exploit. By routing requests through a rotating proxy pool, an attacker can bypass the 3-second cooldown and flood a victim's phone with thousands of SMS messages per minute.&lt;/p&gt;

&lt;p&gt;$$\text{5 SMS} \times \frac{60\text{s}}{3\text{s}} = 100\text{SMS/min per IP}$$ With 10 proxy IPs, that is 1,000 SMS messages sent to a single victim every minute, resulting in severe harassment, carrier costs, and temporary denial of mobile service.&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%2Fw6etbnrgsi0ora0h0fkn.jpg" 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%2Fw6etbnrgsi0ora0h0fkn.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Responsible Disclosure &amp;amp; Recommendations
&lt;/h2&gt;

&lt;p&gt;_All testing was strictly restricted to developer-owned SIM cards/phone numbers, and no live user accounts were targeted. We have responsibly disclosed these findings to the platform vendor.&lt;/p&gt;

&lt;p&gt;To fix these vulnerabilities, we recommend implementing the following architectural remediations:_&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implement Account Lockout: Tie the rate limiter to the phone number (identity) instead of just the IP address. Lock the phone number out of the authentication flow after 5 failed validation attempts.&lt;/li&gt;
&lt;li&gt;Increase Entropy: Shift from a 4-digit OTP (10,000 combinations) to a 6-digit OTP (1,000,000 combinations). This increases the search space by a factor of 100, rendering brute-forcing through proxy pools completely impractical.&lt;/li&gt;
&lt;li&gt;Strict Token TTLs: Shorten the OTP validity window to 2 minutes.&lt;/li&gt;
&lt;li&gt;CAPTCHA Gateways: Introduce a reCAPTCHA or Turnstile verification challenge after the first OTP resend attempt on the registration screen.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
      <category>startup</category>
    </item>
    <item>
      <title>hi</title>
      <dc:creator>Srichinmai Sripathi</dc:creator>
      <pubDate>Thu, 14 May 2026 05:02:33 +0000</pubDate>
      <link>https://forem.com/chinmai_sri/hi-5gci</link>
      <guid>https://forem.com/chinmai_sri/hi-5gci</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" class="crayons-story__hidden-navigation-link"&gt;I Built an AI That Has to Lie to the Internet to Do Its Job&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/chinmai_sri" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3927912%2Ffedb15b2-df07-4267-8e3f-022a87e8a0ce.png" alt="chinmai_sri profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/chinmai_sri" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Srichinmai Sripathi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Srichinmai Sripathi
                
              
              &lt;div id="story-author-preview-content-3665779" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/chinmai_sri" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3927912%2Ffedb15b2-df07-4267-8e3f-022a87e8a0ce.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Srichinmai Sripathi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" id="article-link-3665779"&gt;
          I Built an AI That Has to Lie to the Internet to Do Its Job
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Srichinmai Sripathi</dc:creator>
      <pubDate>Thu, 14 May 2026 05:02:24 +0000</pubDate>
      <link>https://forem.com/chinmai_sri/-8jh</link>
      <guid>https://forem.com/chinmai_sri/-8jh</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" class="crayons-story__hidden-navigation-link"&gt;I Built an AI That Has to Lie to the Internet to Do Its Job&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/chinmai_sri" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3927912%2Ffedb15b2-df07-4267-8e3f-022a87e8a0ce.png" alt="chinmai_sri profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/chinmai_sri" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Srichinmai Sripathi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Srichinmai Sripathi
                
              
              &lt;div id="story-author-preview-content-3665779" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/chinmai_sri" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3927912%2Ffedb15b2-df07-4267-8e3f-022a87e8a0ce.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Srichinmai Sripathi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" id="article-link-3665779"&gt;
          I Built an AI That Has to Lie to the Internet to Do Its Job
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I Built an AI That Has to Lie to the Internet to Do Its Job</title>
      <dc:creator>Srichinmai Sripathi</dc:creator>
      <pubDate>Wed, 13 May 2026 19:51:26 +0000</pubDate>
      <link>https://forem.com/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj</link>
      <guid>https://forem.com/chinmai_sri/i-built-an-ai-that-has-to-lie-to-the-internet-to-do-its-job-7pj</guid>
      <description>&lt;p&gt;At PCI Oasis Inc ,  I was handed a task that sounded simple on paper:&lt;/p&gt;

&lt;p&gt;"Help build a crawler that navigates e-commerce websites from the homepage to the checkout page."&lt;/p&gt;

&lt;p&gt;Easy enough, right? Open a browser, click some buttons, reach checkout. Done.&lt;/p&gt;

&lt;p&gt;Except the internet doesn't want you to do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Every major e-commerce platform, your favourite fashion brands, electronics stores, and sneaker sites run some form of bot detection. Cloudflare. DataDome. PerimeterX. Akamai. Kasada.&lt;/p&gt;

&lt;p&gt;These systems are sophisticated. They don't just check if you're sending the right HTTP headers. They watch how you behave in the browser.&lt;/p&gt;

&lt;p&gt;They measure things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does your mouse move in a straight line?&lt;/li&gt;
&lt;li&gt;Do you type at a perfectly constant speed?&lt;/li&gt;
&lt;li&gt;Does your browser have a Canvas fingerprint they've seen a thousand times before?&lt;/li&gt;
&lt;li&gt;Is your WebGL renderer showing signs of a headless cloud VM?&lt;/li&gt;
&lt;li&gt;If anything looks off and I mean anything you get a CAPTCHA, a silent redirect, or just an empty page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our crawler had to get through all of that. Autonomously. On any site. Without a human in the loop.&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%2Fpz25ctot1ayjjbkvqsje.jpg" 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%2Fpz25ctot1ayjjbkvqsje.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fingerprint, Meet Counterfeit
&lt;/h2&gt;

&lt;p&gt;Here's what I didn't expect: your browser has a fingerprint, and headless browsers have a very obvious one.&lt;/p&gt;

&lt;p&gt;When Chrome runs in headless mode on a cloud server, several things give it away. &lt;br&gt;
The fix? Patch every one of these before the page even loads.&lt;/p&gt;

&lt;p&gt;But that's just the beginning. The really interesting stuff is the Canvas fingerprint.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Your Browser's Art Class Betrays You
&lt;/h2&gt;

&lt;p&gt;Here's something wild: websites can tell a lot about your browser by asking it to draw something.&lt;/p&gt;

&lt;p&gt;The HTML5 Canvas API lets JavaScript render graphics. But the exact pixel output of that rendering varies slightly between real hardware, operating systems, and GPU drivers. Headless Chrome on a cloud VM produces a consistent, identifiable hash — because it always runs on the same virtual GPU.&lt;/p&gt;

&lt;p&gt;Bot detection systems have a database of these hashes. If yours matches a known headless browser fingerprint blocked.&lt;/p&gt;

&lt;p&gt;The solution? Add noise to the Canvas output. Tiny, imperceptible random variations that make each session produce a unique hash.&lt;/p&gt;

&lt;p&gt;Same goes for WebGL — the GPU fingerprint. Headless Chrome on GCP returns "Google SwiftShader" as the renderer. That's a dead giveaway.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Mouse Problem
&lt;/h2&gt;

&lt;p&gt;This one is my favourite.&lt;/p&gt;

&lt;p&gt;Humans don't move their mouse in straight lines. Watch yourself right now your cursor curves, accelerates, decelerates, overshoots slightly and corrects. It's a beautiful, messy, organic path.&lt;/p&gt;

&lt;p&gt;Bots move in straight lines. Or they teleport. Both are instant flags.&lt;/p&gt;

&lt;p&gt;The solution: Bézier curve mouse simulation.&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%2Fenfiitvw05y3fj0fho5k.jpg" 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%2Fenfiitvw05y3fj0fho5k.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Bézier curve is a mathematical curve defined by control points. By generating random control points between the current cursor position and the target, you get a realistic, curved path with natural acceleration and deceleration.&lt;/p&gt;

&lt;p&gt;Typing works the same way. Real people don't type at exactly 120ms per keystroke. They have rhythm, occasional hesitation, and natural variance. Gaussian-distributed delays simulate that.&lt;/p&gt;
&lt;h2&gt;
  
  
  But Wait!!  What About the AI Part?
&lt;/h2&gt;

&lt;p&gt;Here's the thing I learned that I didn't expect going in:&lt;/p&gt;

&lt;p&gt;The hardest part of building an AI-powered crawler isn't the AI.&lt;/p&gt;

&lt;p&gt;It's getting the browser to a state where the AI's decisions can actually execute.&lt;/p&gt;

&lt;p&gt;Once you've dealt with fingerprinting, WAFs, and cookie consent banners the AI's job of "figure out how to navigate this checkout" is almost the easy part. The browser is finally in a clean, unblocked state where clicks actually work.&lt;/p&gt;

&lt;p&gt;I can't share everything about how the AI navigation works that's the core product. But I'll say this: the most interesting design decision was figuring out when NOT to use AI.&lt;/p&gt;

&lt;p&gt;Calling an LLM for every single navigation step is slow and expensive. The real insight was building a system that handles ~60% of decisions with zero AI at all, pure pattern matching and saves the AI for the genuinely hard cases.&lt;/p&gt;

&lt;p&gt;That's the architectural principle I'm taking with me: AI is most powerful when it's used precisely, not constantly.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Took Away
&lt;/h2&gt;

&lt;p&gt;The impressive part isn't the model. It's everything around the model the infrastructure that gets it into a position where it can actually do something useful.&lt;/p&gt;

&lt;p&gt;The browser stealth work, the WAF bypass strategies, the Bézier mouse simulation none of that involves a single API call to an LLM. But without it, the AI is completely useless.&lt;/p&gt;

&lt;p&gt;That gap between "AI that works in demos" and "AI that works in production on the real internet" is enormous. And crossing it is mostly an engineering problem, not an AI problem.&lt;/p&gt;

&lt;p&gt;If this was interesting to you, the company I worked with PCI Oasis builds security tools for e-commerce payment protection. Their e-skimming labs (the other project I worked on) are open to the public at labs.pcioasis.com if you want to explore real attack simulations in a safe environment. &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.pcioasis.com/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;pcioasis.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;And if you have questions about any of the techniques above, drop them in the comments. Happy to dig in.&lt;/p&gt;

&lt;p&gt;Thanks for reading my article :)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>security</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
