FRO

Under Fire: AI-Automated Security vs. a Real Botnet

Full documentation: method, schedule, dated results, nulls, failures and limitations.

This was not planned. Around the evening of October 30, 2026, a botnet started steadily probing the server that runs this website, from many places at once. It caught us by surprise. Rather than just weather it, we are turning the surprise into something that teaches us and makes the organization stronger: an ongoing, real-world test of the security we built ourselves.

The test: our own server firewall, plus FNAI Sentinel and FNAI Threat Watch, watched over by AI agents, against real attackers instead of a lab. No intrusions found: every accepted SSH login from Oct 31 to Nov 8 was reviewed and matched our own access (wording corrected Nov 8). Whether FNAI Sentinel specifically stopped anything is still unverified. We have not added any new blocking for this, and we are not striking back. We are only watching and writing down what happens.

What happened

Our monitoring normally sees a few hundred outside events an hour, which is ordinary background noise for any server on the internet. Starting the evening of October 30 (Mountain Time) it climbed to about 1,000 events an hour across everything we monitor, and stayed there. Counting only outside traffic that reaches this one server, the level has held around 700 to 780 an hour.

The pattern is what makes it look like a botnet rather than one noisy scanner: the traffic comes from well over a thousand different networks, and almost every one of them stays quiet, under about 45 attempts an hour. Each source looks harmless alone. Together they add up.

The questions

The method

What is early

Everything here is early. About a day of a planned eight is in. Counts describe what reached our logs; they do not tell us who is behind the traffic or why. Threat Watch also gives a rough score for whether the traffic is aimed at FRO in particular or is generic internet scanning. Right now it says inconclusive, and that is a heuristic, not a probability.

One honest note on keeping up: when Threat Watch was restarted on the morning of October 31, it went back and recorded the events it had not yet read, so some records from that morning arrived hours late. Since then it has kept pace within seconds. We are watching whether that holds all week.

Latest results

Latest run 2026-11-09 · day 10 · ongoing · updated Nov 9, 2026 7:58 AM MT

Day 10, ongoing (through Nov 9, 7 AM MT): 190,174 outside events reached the OVH server's firewall, SSH and web logs, about 799 per full hour (median), from 8,725 source networks. 99.7% of network-hours stayed under 45 events. No intrusions found: every accepted SSH login from Oct 31 to Nov 8 was reviewed and matched our own access; after that, automated log rules have flagged 0 outside logins or admin access so far. Web median response 3 ms (95th percentile 13 ms); 0 server errors out of 36,130 requests.

Early signal: this is ongoing passive observation with no end date. Counts describe what reached our logs, not who is behind it or why.

Correction (Nov 8, 2026): earlier versions of this page said "Logins or admin access by outsiders: 0" and "nothing has got through". That claimed more than we had checked at the time. We have now reviewed every accepted SSH login from Oct 31 to Nov 8, and all of them matched our own access. Whether FNAI Sentinel specifically prevented anything is still unverified.

Events per hour (Mountain Time)

10270Fri 6PM: 300Fri 7PM: 258Fri 8PM: 415Fri 9PM: 296Fri 10PM: 721Fri 11PM: 302Sat 12AM: 443Sat 1AM: 584Sat 2AM: 723Sat 3AM: 699Sat 4AM: 736Sat 5AM: 741Sat 6AM: 775Sat 7AM: 769Sat 8AM: 754Sat 9AM: 777Sat 10AM: 745Sat 11AM: 682Sat 12PM: 713Sat 1PM: 769Sat 2PM: 730Sat 3PM: 759Sat 4PM: 746Sat 5PM: 755Sat 6PM: 745Sat 7PM: 770Sat 8PM: 808Sat 9PM: 788Sat 10PM: 799Sat 11PM: 739Sun 12AM: 718Sun 1AM: 713Sun 1AM: 715Sun 2AM: 747Sun 3AM: 745Sun 4AM: 840Sun 5AM: 945Sun 6AM: 938Sun 7AM: 941Sun 8AM: 959Sun 9AM: 951Sun 10AM: 922Sun 11AM: 938Sun 12PM: 936Sun 1PM: 931Sun 2PM: 912Sun 3PM: 929Sun 4PM: 909Sun 5PM: 910Sun 6PM: 921Sun 7PM: 904Sun 8PM: 939Sun 9PM: 926Sun 10PM: 1008Sun 11PM: 992Mon 12AM: 1027Mon 1AM: 967Mon 2AM: 925Mon 3AM: 958Mon 4AM: 970Mon 5AM: 974Mon 6AM: 963Mon 7AM: 963Mon 8AM: 945Mon 9AM: 938Mon 10AM: 949Mon 11AM: 952Mon 12PM: 940Mon 1PM: 940Mon 2PM: 970Mon 3PM: 958Mon 4PM: 959Mon 5PM: 958Mon 6PM: 950Mon 7PM: 949Mon 8PM: 957Mon 9PM: 954Mon 10PM: 930Mon 11PM: 941Tue 12AM: 964Tue 1AM: 962Tue 2AM: 943Tue 3AM: 947Tue 4AM: 927Tue 5AM: 952Tue 6AM: 944Tue 7AM: 949Tue 8AM: 952Tue 9AM: 935Tue 10AM: 946Tue 11AM: 945Tue 12PM: 978Tue 1PM: 930Tue 2PM: 946Tue 3PM: 968Tue 4PM: 948Tue 5PM: 844Tue 6PM: 840Tue 7PM: 916Tue 8PM: 934Tue 9PM: 899Tue 10PM: 922Tue 11PM: 907Wed 12AM: 895Wed 1AM: 889Wed 2AM: 931Wed 3AM: 886Wed 4AM: 874Wed 5AM: 858Wed 6AM: 904Wed 7AM: 909Wed 8AM: 883Wed 9AM: 910Wed 10AM: 880Wed 11AM: 887Wed 12PM: 816Wed 1PM: 863Wed 2PM: 846Wed 3PM: 801Wed 4PM: 850Wed 5PM: 820Wed 6PM: 811Wed 7PM: 791Wed 8PM: 797Wed 9PM: 792Wed 10PM: 810Wed 11PM: 795Thu 12AM: 789Thu 1AM: 825Thu 2AM: 787Thu 3AM: 819Thu 4AM: 785Thu 5AM: 799Thu 6AM: 810Thu 7AM: 804Thu 8AM: 794Thu 9AM: 789Thu 10AM: 789Thu 11AM: 787Thu 12PM: 791Thu 1PM: 795Thu 2PM: 805Thu 3PM: 786Thu 4PM: 788Thu 5PM: 790Thu 6PM: 810Thu 7PM: 782Thu 8PM: 796Thu 9PM: 795Thu 10PM: 792Thu 11PM: 791Fri 12AM: 781Fri 1AM: 791Fri 2AM: 761Fri 3AM: 811Fri 4AM: 792Fri 5AM: 813Fri 6AM: 779Fri 7AM: 817Fri 8AM: 798Fri 9AM: 799Fri 10AM: 783Fri 11AM: 783Fri 12PM: 809Fri 1PM: 785Fri 2PM: 787Fri 3PM: 795Fri 4PM: 786Fri 5PM: 793Fri 6PM: 799Fri 7PM: 793Fri 8PM: 762Fri 9PM: 764Fri 10PM: 767Fri 11PM: 785Sat 12AM: 737Sat 1AM: 742Sat 2AM: 778Sat 3AM: 756Sat 4AM: 787Sat 5AM: 755Sat 6AM: 756Sat 7AM: 795Sat 8AM: 763Sat 9AM: 745Sat 10AM: 746Sat 11AM: 763Sat 12PM: 761Sat 1PM: 780Sat 2PM: 770Sat 3PM: 766Sat 4PM: 766Sat 5PM: 795Sat 6PM: 802Sat 7PM: 792Sat 8PM: 798Sat 9PM: 798Sat 10PM: 796Sat 11PM: 805Sun 12AM: 777Sun 1AM: 805Sun 2AM: 782Sun 3AM: 793Sun 4AM: 791Sun 5AM: 793Sun 6AM: 801Sun 7AM: 806Sun 8AM: 771Sun 9AM: 799Sun 10AM: 782Sun 11AM: 796Sun 12PM: 801Sun 1PM: 791Sun 2PM: 790Sun 3PM: 800Sun 4PM: 804Sun 5PM: 799Sun 6PM: 798Sun 7PM: 772Sun 8PM: 785Sun 9PM: 854Sun 10PM: 871Sun 11PM: 953Mon 12AM: 795Mon 1AM: 799Mon 2AM: 800Mon 3AM: 804Mon 4AM: 808Mon 5AM: 786Mon 6AM: 797Mon 7AM: 725Fri 6PMSun 7AMMon 9PMWed 11AMFri 1AMSat 3PMMon 5AM

Outside events only (our own and agent traffic removed). Mean 826, median 799, busiest full hour 1,027. First and last hours are partial.

What kinds of attempts

TypeEventsShare
Port scans161,45784.9%
Connection attempts to open services27,12714.3%
Web requests (general)1,0060.5%
SSH password guessing5270.3%
Requests aimed at FRO pages560.0%
API abuse attempts10.0%

Ports knocked on most (firewall)

Port (service)EventsShare of top 12
23 (Telnet)28,40637.7%
22 (SSH)12,28416.3%
443 (HTTPS)10,03313.3%
3389 (Remote Desktop)5,8597.8%
80 (HTTP)5,4107.2%
1433 (MS SQL)4,0965.4%
5432 (PostgreSQL)2,3953.2%
2222 (alt SSH)1,8612.5%
3306 (MySQL)1,5212.0%
8443 (alt HTTPS)1,3971.9%
8080 (alt HTTP)1,3601.8%
53 (DNS)8221.1%

What the web probes were looking for

CategoryRequests
WordPress admin / login probes511
Config / secret file hunting (.env, .git, backups)398
PHP shells / script probes311
API endpoint probing61
Generic admin / login panels18

Generic categories from the web server log, counting only requests that did not get a normal page back. Exact paths are not published.

Many sources, each one quiet

MeasureValue
Distinct source networks (/24)8,725
Median events per network per hour2
99th percentile per network per hour26
Network-hours under 45 events99.7%
Busiest single network-hour461

Did our stack keep up?

CheckResult
Accepted SSH logins Oct 31 to Nov 8 (reviewed by hand)all matched our own access
SSH logins flagged as not ours (automated log rule)0
Successful admin requests flagged as not ours (automated log rule)0
Threat Watch time from event to record (median)20.0 s
Same, latest day (95th percentile / worst)225.0 s / 493.0 s
Web response, median / 95th percentile3 ms / 13 ms
Web server errors (5xx)0 of 36,130
Home page from outside (daily probe)5/5 OK, median 0.447 s
Server load average (1/5/15 min)0.47 / 0.41 / 0.46
Automatic bans by the existing ban service in window266
Server firewallactive, restarts 0
Automatic ban service (already in place)active, restarts 0
FNAI Threat Watchactive, restarts 0
FNAI Sentinelactive, restarts 745
Web serveractive, restarts 0

Web response time per hour

430880Wed 12PM: 17Wed 1PM: 12Wed 2PM: 11Wed 3PM: 13Wed 4PM: 12Wed 5PM: 12Wed 6PM: 14Wed 7PM: 13Wed 8PM: 11Wed 9PM: 12Wed 10PM: 11Wed 11PM: 12Thu 12AM: 76Thu 1AM: 11Thu 2AM: 10Thu 3AM: 11Thu 4AM: 12Thu 5AM: 13Thu 6AM: 11Thu 7AM: 15Thu 8AM: 10Thu 9AM: 14Thu 10AM: 10Thu 11AM: 10Thu 12PM: 10Thu 1PM: 13Thu 2PM: 10Thu 3PM: 11Thu 4PM: 13Thu 5PM: 15Thu 6PM: 14Thu 7PM: 83Thu 8PM: 10Thu 9PM: 9Thu 10PM: 12Thu 11PM: 10Fri 12AM: 10Fri 1AM: 9Fri 2AM: 18Fri 3AM: 10Fri 4AM: 9Fri 5AM: 11Fri 6AM: 10Fri 7AM: 10Fri 8AM: 10Fri 9AM: 10Fri 10AM: 17Fri 11AM: 10Fri 12PM: 9Fri 1PM: 12Fri 2PM: 10Fri 3PM: 10Fri 4PM: 12Fri 5PM: 17Fri 6PM: 11Fri 7PM: 12Fri 8PM: 12Fri 9PM: 10Fri 10PM: 13Fri 11PM: 10Sat 12AM: 12Sat 1AM: 10Sat 2AM: 10Sat 3AM: 10Sat 4AM: 10Sat 5AM: 10Sat 6AM: 14Sat 7AM: 11Sat 8AM: 16Sat 9AM: 14Sat 10AM: 49Sat 11AM: 13Sat 12PM: 14Sat 1PM: 21Sat 2PM: 12Sat 3PM: 56Sat 4PM: 12Sat 5PM: 11Sat 6PM: 10Sat 7PM: 16Sat 8PM: 16Sat 9PM: 43088Sat 10PM: 15Sat 11PM: 18Sun 12AM: 14Sun 1AM: 11Sun 2AM: 14Sun 3AM: 12Sun 4AM: 14Sun 5AM: 11Sun 6AM: 10Sun 7AM: 17Sun 8AM: 15Sun 9AM: 11Sun 10AM: 11Sun 11AM: 10Sun 12PM: 11Sun 1PM: 11Sun 2PM: 76Sun 3PM: 10Sun 4PM: 29785Sun 5PM: 11Sun 6PM: 11Sun 7PM: 11Sun 8PM: 10Sun 9PM: 10Sun 10PM: 10Sun 11PM: 10Mon 12AM: 9Mon 1AM: 10Mon 2AM: 9Mon 3AM: 10Mon 4AM: 12Mon 5AM: 11Mon 6AM: 42Mon 7AM: 466Wed 12PMThu 7AMFri 2AMFri 9PMSat 4PMSun 11AMMon 6AM

95th percentile response time in milliseconds, all web requests, per hour.

Data pulled read-only 2026-11-09 14:58 UTC; refreshed daily. Heuristic targeting score from Threat Watch: 25/100 (Some FRO-specific signals; inconclusive (could still be generic scanning)). It is a heuristic, not a probability.

What comes next

The observation is ongoing, with no end date. The numbers above refresh daily. James reviews the record as it grows, and we will write up what held, what did not, and what we are changing because of it, while the test keeps running. We will keep calling these results early.