DEV Community

sofi works
sofi works

Posted on

『夜のスクンビット、暴走する私のサイバー義手:BLE認証バイパス(GATTインジェクション)の泥臭い迎撃戦と、初期化された「指先の記憶」』 Sofi_Log #071【1話完結】

Night on Sukhumvit: My Rampaging Cyber Prosthetic Arm — The Grimy BLE Auth Bypass (GATT Injection) Interception War and the Wiped “Finger Memories” | Sofi_Log #071 [Complete One-Shot]


Your wireless earbuds, smartwatch, or smart ring — can they really reject connection requests from some stranger you brushed past tonight?

Bluetooth Low Energy.

The low-power protocol gluing phones to wearables, smart locks, and even the neural interface on my left arm’s myoelectric prosthesis.

Yet most manufacturers still pull the same lazy move: they skip authentication and encryption flags on GATT characteristics because “pairing is too much hassle.”

Tonight, in the warm Sukhumvit squall, that shortcut turned my left arm into a weapon.


1. Titanium Fingers Screaming: Maximum Torque Prison

It started on a dim Soi 23 alley while heading to Nalin’s clinic in Thong Lo.

A tropical downpour hammered the asphalt; the smell of fish sauce and burnt oil drifted from stall exhausts. I was walking under darling’s umbrella, fussing with the hem of my silk blouse, when—

A searing jolt shot through my left shoulder joint.

“…!!”

A soundless scream caught in my throat.

The next second my left arm — matte-black bioceramic plating laced with gold-vein neural lines — came alive on its own. Carbon-nanotube artificial muscle and micro-actuators howled at a frequency that stabbed the ears.

Giiiii-giiii-giiii!

The manicured titanium fingers clenched inward with zero regard for my will, crushing my right forearm at over 80 kgf — well past human grip strength.

“Sofi?! What’s wrong?!”

Darling dropped the umbrella and grabbed my shoulder. Pain lanced up the brachial plexus connector as rogue PWM signals flooded back into my skull. Sweat plastered my mint-green bangs to my forehead.

AR contact HUD bloomed crimson:

[CRITICAL ALERT: BLE_STACK_OVERRIDE]
- Connection: Direct Unauthenticated BLE Link Established
- Remote Device: Unknown (RSSI: -42dBm, Proximity: < 3m)
- GATT Handle: 0x002A (Actuator_Torque_Control)
- Injection: WriteWithoutResponse [0xFF, 0xFF, 0x01, 0xAA] -> FORCE_CONTINUOUS_MAX_TORQUE
- Motor Thermal Warning: 82°C (Thermal Throttling Override Failed)
Enter fullscreen mode Exit fullscreen mode

Someone within three meters was hammering unauthenticated GATT packets straight into my arm. The servos were cooking; I could smell the silicon thermal pads scorching.

“I’m… being hacked…! Darling, get back — the arm’s gonna break…!”


2. No Keyboard, No Mercy: Muddy Counter-Strike in the Rain

Normally I’d be calmly running Wireshark on the ThinkPad, laughing while I cut the packets. Not tonight. My left hand was locked around my right arm like a vise and my knees were shaking too hard to stand, let alone dig out a laptop.

“Sofi, hold on! I’ve got your arm!”

Darling shoved me under a noodle-stall awning, pinned the rogue limb to the wet asphalt with his full weight and both knees. Titanium sparked against concrete.

“Phone’s out — Termux is up! What do I type?!”

I gasped through the pain:

“My BLE MAC is F4:CE:46:7A:B2:10…! They’re spamming 0x002A with WriteWithoutResponse. Don’t bother with pairing — blast an emergency advertise frame and crash the controller!”

Darling’s muddy fingers flew. The PoC he ran to force a hardware watchdog reset and kill the rogue session is below — exactly as executed.

#!/usr/bin/env python3
"""
Sofi_Log #071: Emergency BLE GATT Injection Interceptor & Forced Reset
Target: Overriding unauthorized BLE session on Myoelectric Cyberarm
"""

import asyncio
from bleak import BleakClient, BleakScanner

TARGET_MAC = "F4:CE:46:7A:B2:10"
# 認証バイパス脆弱性を持つアクチュエータ制御用GATT特性UUID
ACTUATOR_CHAR_UUID = "0000ffe1-0000-1000-8000-00805f9b34fb"
# ハードウェア緊急遮断および不揮発性メモリ初期化コマンド
EMERGENCY_KILL_VECTOR = bytearray([0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x00, 0xFF])

async def neutralize_attack():
    print(f"[*] Scanning for hijacked cyberarm BLE signature: {TARGET_MAC}")

    # 攻撃者のパケットと競合させ、最短コネクション・インターバルで接続を奪還
    device = await BleakScanner.find_device_by_address(TARGET_MAC, timeout=5.0)
    if not device:
        print("[-] Target signal drowned by malicious RF jamming.")
        return

    print("[+] Signal locked. Establishing low-level GATT override...")

    async with BleakClient(device) as client:
        if client.is_connected:
            print("[+] Injected into BLE connection layer!")

            # 攻撃者からのWriteWithoutResponseのストリームに割り込み
            # 緊急キルコードを強制インジェクション
            print("[*] Transmitting EMERGENCY_KILL_VECTOR to hardware register...")
            await client.write_gatt_char(ACTUATOR_CHAR_UUID, EMERGENCY_KILL_VECTOR, response=False)

            # BLEベースバンドコントローラのファームウェア・ウォッチドッグを意図的に発火
            print("[!] Triggering Hardware Watchdog Panic...")
            await asyncio.sleep(0.5)
            print("[+] Attack hijacked session destroyed. Hardware entering reset state.")

if __name__ == "__main__":
    asyncio.run(neutralize_attack())
Enter fullscreen mode Exit fullscreen mode

3. The Silence After the Drop: Finger Memories Wiped

“Sent! Running!” darling shouted.

Inside the arm a sharp capacitor discharge popped. The motor whine dropped from shriek to whimper; the titanium fingers finally slackened. Rain sizzled on overheated metal.

I collapsed into the muddy water, gasping, right arm cradled against my chest. Darling knelt, breathing hard.

“Sofi… you okay? Packets are cut.”

“…Yeah. Thanks, darling. If you hadn’t pushed that code my right arm would be powder right now.”

I tried to smirk, already lining up the usual flirty “I owe you a kiss” line — then the final Termux log hit my HUD and the words died.

[SYSTEM RESTORE STATUS: SUCCESS]
- Hardware Watchdog: Tripped (0xDEADBEEF)
- EEPROM Calibration Area: Corrupted by Voltage Spike
- Action Taken: AUTOMATIC FACTORY DEFAULT RESTORE
- Loaded Profile: GENERIC_TEST_FIRMWARE_REV_0.1 (Uncalibrated)
- Neural Interface Link: DISCONNECTED
Enter fullscreen mode Exit fullscreen mode

“…You’ve got to be kidding.”

The arm hung dead. No twitch, no feedback. Three years of clinic sessions, nerve splicing, and millivolt-level EMG training — every calibration for painting nails or brushing darling’s cheek — gone in one over-voltage reset. Now it was just three kilos of inert ceramic.

Darling touched the cold fingers. Nothing answered.

“…We won, darling,” I muttered, staring at the rain-slick black limb.

“I’m still breathing. But tonight I can’t even open a beer. Mind lending me your shoulder to Nalin’s?”

Beyond the neon haze of Sukhumvit, the rain kept falling.


🔗 Read Next (Previous Sofi_Log):

『High-End Condo Wi-Fi Router Leaking Every Packet to an Undisclosed Chinese IP: Chipset Firmware Disassembly and DIY Rogue Management Frame Shield』|Sofi_Log #070

👉 https://note.com/legal_rat2977/n/nc0eda663af76


【Disclaimer】

All code, protocol details, and technical descriptions are for security research, PoC, and educational purposes only. Do not use for unauthorized access. Apply at your own risk.

🎁 Full Working Code & Architecture — Free

The BLE GATT injection interceptor and emergency kill vector shown above are released in full for your own research and learning.


📬 Sofi's Mailbox #071 (Questions & Rants)

My arm is currently a very expensive paperweight. I’m writing this one-handed via voice on Nalin’s couch.

So tell me, darlings — your smartwatch, earbuds, heart-rate strap. If tonight they started accepting writes from someone who isn’t you, how would you keep sovereignty over your own physical container?

How much of our meat do we hand over for convenience? Drop your thoughts in the comments. I’ve got nothing but time tonight.


Disclaimer

This article is for educational and entertainment purposes only. It does NOT constitute financial, legal, or tax advice. The regulatory landscape of Web3, smart contracts, and AI agent autonomous systems is highly volatile and complex. Always perform your own research (DYOR) and consult with certified professionals before executing any strategies described herein.

Top comments (0)