惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
罗磊的独立博客
S
SegmentFault 最新的问题
V
V2EX
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
博客园 - 三生石上(FineUI控件)
Stack Overflow Blog
Stack Overflow Blog
Y
Y Combinator Blog
MyScale Blog
MyScale Blog
D
Docker
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
M
Microsoft Research Blog - Microsoft Research
Martin Fowler
Martin Fowler
S
Secure Thoughts
B
Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
T
True Tiger Recordings
GbyAI
GbyAI
P
Proofpoint News Feed
P
Privacy International News Feed
Jina AI
Jina AI
The Cloudflare Blog
I
Intezer
AWS News Blog
AWS News Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Security Archives - TechRepublic
NISL@THU
NISL@THU
The Register - Security
The Register - Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
S
Schneier on Security
L
LINUX DO - 热门话题
C
CXSECURITY Database RSS Feed - CXSecurity.com
Security Latest
Security Latest
C
Cybersecurity and Infrastructure Security Agency CISA

DEV Community

Unchaining the African Creator Economy The Treasure Hunt Engine Gotcha - A Lesson in Constrained Performance great_cto v2.17 - no more tambourine dance When Catalogs Are Embedded in Storage SafeMind AI: Instant Health & Safety Intelligence What Is PKCE, How It Works & Flow Examples AI Agent Failure Modes Beyond Hallucination Fastest Way to Understand Stryker Solana Accounts Explained to a Web2 Developer TV Yayın Akışı Sitesi Geliştirirken Öğrendiğim Teknik Dersler $500 Challenge Drop My First Look at Google's Gemma 4: A Quick Introduction How I use an LLM as a translation judge Best Calendar and Scheduling API for Developers — 2026 Comparison Agentic AI in Travel: Why UCP Isn't Travel-Ready Yet — and What We Measured I Finished Machine Learning. And Then Changed The Plan. The Five-Thousand-Line File The AI Whirlwind: Why Your Local Agent Matters More Than Ever I Built an Oracle DBA That Lives in Telegram. It Cut a 500K-Row Scan to 5 - After Asking Permission. The Day 2 Reality of Running a Kubernetes Lab on Your Mac: Stop/Start, CKS Scenarios, and What I Learned Building It. n8n for Airtable Power Users: 5 Automations That Take Your Base to the Next Level Validating Gemma 4 for Industrial IoT: A Governance Pattern VS Code Now Credits Copilot on Every Commit by Default Astro and Islands Architecture: Why Your Portfolio Doesn't Need React for Everything Booting from FAT12: How I added file reading to my x86 kernel Unity’s AI agent went public: the developers of a static analysis tool on what that means for code quality Anna's Archive publica un llms.txt para los LLMs que rastrean su catálogo CRDTs for Offline-First Mobile Sync Why I Built Mneme HQ: Preventing AI Agent Architectural Drift Google Antigravity 2.0 Is the I/O 2026 Announcement You Should Actually Care About I Built a Pay-Per-Call Crypto Signal API with x402 — Heres the Architecture JWT Token Refresh Patterns in React 19: Avoiding the Silent Auth Death Spiral 🚀 “From Prompts to Autonomous Agents: What Google I/O 2026 Changed” The Power of Distributed Consensus in Autonomous SOCs Sixteen TUI components, copy-paste, no dependency The Boring Reliability Layer Every Autonomous Agent Needs Nven - Secret manager Building Multi-Tenant Row-Level Security in PostgreSQL: A Production Pattern The Hardest Part of Being a Developer Isn't Coding Building Vylo — Looking for Collaborators, Partners & Early Support I Thought Memory Fades With Time. It Actually Fades With Information. ORA-00064 오류 원인과 해결 방법 완벽 가이드 I registered an AI agent at 1 AM and something cracked open in my head Pitch: Nven - Sync secrets. Ship faster. Why y=mx+b is the heart of AI From Routines to a Crew — Building a System That Plans Its Own Work & executes it 25 React Interview Questions 2026 (With Answers) — Hooks, React 19, Concurrent Mode An open source LLM eval tool with two independent quality signals Using Dashboard Filtering to Get Customer Usage in Seconds from TBs of Data Skills, Java 17, And Theme Accents 4 Hard Lessons on Optimizing AI Coding Agents Arctype: Cross-Platform Database GUI for LLM Artifacts Your robots.txt says GPTBot is welcome. Your server says 403. Organizing How to Use AWS Glue Workflow 5 n8n Automations Every Digital Agency Should Be Running (Bill More, Work Less) Getting Started with TorchGeo — Remote Sensing with PyTorch Designing a Scalable Cross-Platform Appium Framework Google Antigravity 2.0 & Slash Commands Building a Unified Adaptive Learning Intelligence with Gemma 4, Flutter, and Multi-Model Orchestration Looking for beta testers for a £60 server management application The Disk-Pressure Incident That Taught Me to Always Set LimitRanges and Other Lessons from Mirroring EKS Locally. Why AI Should Not Write SQL Against ERP Databases Vibe coding works until it doesn't. The debt is real. Shipping at the Edge: Migrating a Coffee Subscription Platform to Cloudflare Workers Stop Tab-Switching: A Developer's Guide to Color Tools That Actually Fit the Workflow DevOps vs MLOps vs AIOps: What Changes, What Stays, and a Simple Roadmap to Get Started Run Powerful AI Coding Locally on a Normal Laptop 5 n8n Automations Every WooCommerce Store Needs (Save 10+ Hours/Week) What I Learned Building My Own AI Harness Hytale Servers Will Fail Treasure Hunts Until We Fix Our Event Handling Redux in React: Managing Global State Like a Pro Unfreezing Your GitHub Actions: Troubleshooting Stuck Deployments and Protecting Your Git Repo Statistics Unlocking Project Discoverability on GHES: A Key to Software Engineering Productivity When the Cleanup Code Becomes the Project Rockpack 8.0 - A React Scaffolder Built for the Age of AI-Assisted Development Mismanaging the Treasure Hunt Engine in Hytale Servers Will Get You Killed Stop Calling It an AI Assistant. It’s Already Managing Your Company Why Hardcoded Automations Fail AI Agents Why I built a post-quantum signing API (and why JWT is on borrowed time) Weekend Thought: Frontend Build Tools Suffer From Work Amnesia AI Is Changing Engineering Culture More Than We Realize A 10-Line Playwright Trick That Saved Me Hours on Every Sephora Run Everyone Was Focused on Gemini, But Infinite Scaler Was the Real Twister "Gemma 4 Analyzed My Bank Statements – Apparently I 'Have a Problem' with Coffee and Late-Night Apps" #css #webdev #beginners #codenewbie The Hidden Layer Every AI Developer Must Learn AlphaEvolve: Google DeepMind's Gemini-Powered Evolutionary Coding Agent RDS Reserved Instance Pricing: Every Engine, Every Rule, Real Dollar Savings How To Build An AI-Powered MVP Without Burning Your Startup Budget In 2026 Reading a Psychrometric Chart Without Getting Lost LMR-BENCH: Can LLM Agents Reproduce NLP Research Code? (EMNLP 2025) How to turn text into colors (without AI) Building Real-Time Apps in Node.js with Rivalis: WebSockets, Rooms, Actors, and a Binary Wire This Week In React #282 : Security, Fate, TanStack, Redux, Jotai | Hermes-node, Expo, Rozenite, Harness | TC39, Bun, pnpm, npm, Yarn, Node AI Copilot vs AI Agent Architecture - What's Actually Different (And Why It Matters) Smart Contract Security: NEAR's Futures Surge and AI Token Risks Database Maintenance: Tracing Production Incidents to Their Root Cause Stop juggling AI SDKs in PHP — meet Prisma Google Quietly Changed What “Apps” Mean at I/O 2026 The Infrastructure Team Is the Real Single Point of Failure
I Hid a Web Server on My Coworker's MacBook to Make It Talk. Eight Years Later, He Still Locks His Screen.
Alexander Mi · 2026-05-14 · via DEV Community

Alexander Mia

Around 2018, I sat across from a coworker — let's call him D — who had a habit of stepping away for lunch with his screen wide open. I told him about it. Twice. He laughed both times and forgot the next day.

So I taught him with twelve lines of Python.

The setup

macOS ships with a command-line utility called say. You pipe text to it, and your laptop talks. Or, more accurately, your laptop talks to everyone in the office.

The plan was simple:

  1. Sneak onto D's laptop while he was at lunch.
  2. Run a tiny HTTP server in the background.
  3. From my own desk, send GET requests with words I wanted his laptop to shout across the room.
  4. Wait.

The whole thing

from subprocess import check_output
from aiohttp import web


async def handle(request):
    name = request.match_info.get("name", "")
    text = name
    check_output(f"/usr/bin/say '{text}'", shell=True)
    return web.Response(text=text)


app = web.Application()
app.add_routes([web.get("/{name}", handle)])

web.run_app(app, port=6063)

Enter fullscreen mode Exit fullscreen mode

Twelve lines. No auth. No rate limit. No input validation. (We will come back to that.)

I ran it on his MacBook over lunch — python server.py & — and walked back to my desk. Then I curled it from across the room:

curl http://<his-laptop>:6063/hello

Enter fullscreen mode Exit fullscreen mode

His MacBook, sitting unattended on his desk, said "hello" in a soft computerized voice.

The whole team turned around. He was still eating his sandwich somewhere on the other side of the building.

The escalation

Over the next forty minutes I tested limits:

curl http://.../I-forgot-to-lock-my-screen
curl http://.../please-lock-your-laptop
curl http://.../this-is-what-happens-when-you-do-not

Enter fullscreen mode Exit fullscreen mode

say handles dashes-as-words pretty well. The laptop announced its own delinquency to the entire team. People stopped working to listen.

When D came back, he stared at his laptop for ten seconds, said one word I will not repeat here, and lunged for the menu bar. The server kept running because I had backgrounded it with &. Closing the terminal did not stop it. He had to kill the PID. He learned about lsof -i :6063 that afternoon.

The actual security lesson

The trick is funny. The underlying flaw is not.

That 12-line server is what an unlocked MacBook looks like to anyone with thirty seconds of physical access:

  • They can run arbitrary shell commands. check_output(shell=True) on user-supplied input is a textbook command injection. In the prank version, I controlled both sides. In a real attack, the attacker controls both sides too — because they have your laptop.
  • They do not need your password. The Python interpreter is already there. Homebrew is already there. curl is already there. Your SSH keys are already there. Your browser's saved passwords are decryptable from a logged-in session.
  • The server survives a screen lock. Once it is running, locking your screen changes nothing. The process keeps listening. The attacker keeps having fun.
  • You will not notice it. A Python process on port 6063 does not show up in your Dock. It does not push a notification. The only sign is the port being open — and who checks lsof -i after lunch?

What I exposed with say, somebody else could exploit with rm, with a curl to a remote webhook that exfiltrates ~/.ssh/, or with a launchd plist that survives reboot and phones home forever. The 12 lines of Python are not the attack. Walking away from the keyboard is the attack.

What you should actually do

  • Set auto-lock. System Settings → Lock Screen → "Require password immediately after screen saver begins." Screen saver delay: one minute, not fifteen.
  • Use Hot Corners. Bottom-left = lock screen. Muscle memory in a week.
  • Enable FileVault. If someone walks off with your laptop, they get an encrypted brick. Without it, they get your home directory.
  • Ctrl+Cmd+Q. Built-in macOS lock shortcut. Use it every single time you stand up. Even for the coffee machine. Especially for the coffee machine.
  • Audit listening ports. Once in a while, lsof -i -P -n | grep LISTEN. You will be surprised what is running.

Why I am writing this in 2026

Because nothing has changed.

Eight years later I still see unlocked screens at every co-working space, every conference, every startup office I walk into. The defenses are better — Touch ID, Apple Watch unlock, FileVault is on by default — but none of them help if you walk away with the session active.

D locks his screen now. Every time. He has muscle memory for Ctrl+Cmd+Q that he did not have before that day. We do not work together anymore, but at conferences he closes his lid before he walks to the bar. Every. Time.

Sometimes the most effective security training is a laptop that announces your own negligence to a room of people you respect.

Twelve lines of Python. One coworker permanently reformed. Zero incidents since.