Skip to content

Commit d69aabf

Browse files
Add files via upload
1 parent 1c8896f commit d69aabf

2 files changed

Lines changed: 63 additions & 9 deletions

File tree

RemoteChangelog.html

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!DOCTYPE html>
1+
<!DOCTYPE html>
22
<html lang="en" itemscope itemtype="https://schema.org/WebPage">
33

44
<head>
@@ -9,7 +9,7 @@
99
<meta name="description"
1010
content="Web Remote Control System changelog — updates for the self-hosted Windows remote management stack (Blazor, ASP.NET Core, SignalR, agent).">
1111
<meta name="author" content="OffCrypt">
12-
<meta name="last-modified" content="2026-07-05">
12+
<meta name="last-modified" content="2026-07-10">
1313
<meta name="robots" content="noindex, follow">
1414

1515
<meta http-equiv="X-Content-Type-Options" content="nosniff">
@@ -60,7 +60,7 @@
6060
"releaseNotes": {
6161
"@type": "TechArticle",
6262
"headline": "Web Remote Control System changelog",
63-
"dateModified": "2026-07-05",
63+
"dateModified": "2026-07-10",
6464
"url": "https://www.dev-offcode.com/RemoteChangelog.html"
6565
}
6666
}
@@ -203,10 +203,30 @@ <h1 class="changelog-title">📝 Changelog</h1>
203203
<div class="changelog-intro">
204204
<p>Release notes for the <strong>Web Remote Control System</strong> — self-hosted ASP.NET Core
205205
backend, Blazor dashboard, SignalR hub, Windows agent, and Server Manager tooling.</p>
206-
<p><strong>Latest:</strong> VER 0.8 (July 5, 2026) adds per-agent AES encryption, per-stub connect tokens for <code>ConnectAsDevice</code> identity validation, and hardened encrypted hub dispatch.</p>
206+
<p><strong>Latest:</strong> VER 0.9 (July 10, 2026) fixes a ConnectAsDevice bypass vulnerability, and adds share link expiry, real-time device ping, Telegram notifications, and replay attack protection.</p>
207207
</div>
208208

209209
<div class="changelog-wrapper">
210+
<!-- VER 0.9 -->
211+
<div class="changelog-entry">
212+
<div class="changelog-version">
213+
<span class="version-tag">VER: 0.9</span>
214+
<span class="version-date">10/07/2026</span>
215+
</div>
216+
<div class="changelog-changes">
217+
<h3>Changes</h3>
218+
<ul>
219+
<li><strong>Security:</strong> <strong>ConnectAsDevice bypass fix</strong> — Fixed a security vulnerability in <code>DeviceControlHub.ConnectAsDevice</code>. When <code>AgentSecurity:RequireConnectToken</code> was set to <code>true</code>, an attacker could bypass the enforcement by sending any unknown <code>agentKeyId</code><code>TryGetConnectToken</code> returned <code>false</code> for the unknown ID, causing the code to skip token validation and allow the connection as a legacy agent. Added an <code>else if (requireToken)</code> branch inside the <code>agentKeyId</code> block: if <code>agentKeyId</code> is provided but not found in the <code>AgentKeys.json</code> registry in strict mode, the connection is now rejected with <code>HubException("Unauthorized")</code> and a warning is logged (<code>ConnectAsDevice: unknown agentKeyId rejected</code>). The attacker would still need the shared <code>AES_MASTER_KEY_HEX</code> to communicate, but the <code>RequireConnectToken</code> enforcement now correctly covers all cases.</li>
220+
<li><strong>Added:</strong> <strong>Share Link Expiry</strong> — Live Stream share links can now have a configurable lifetime. In the stream toolbar, set <strong>Hours</strong> and <strong>Minutes</strong> or enable <strong>No time limit</strong>. The backend registers sessions in <code>ShareSessionService</code>; <code>ShareExpiryService</code> expires them and notifies viewers via <code>ShareExpired</code>. Admin UI shows a countdown while sharing. Server validates links on <code>JoinShare</code> and <code>BroadcastSharedFrame</code> (1 min – 7 days, or unlimited).</li>
221+
<li><strong>Added:</strong> <strong>Real-time Device Ping</strong><code>DevicePingService</code> pings connected agents every 10 s; agents respond with <code>Pong</code>; RTT is shown in the connected devices list (<code>PingMs</code>, color-coded). Cleartext ping IDs only (no sensitive payload).</li>
222+
<li><strong>Added:</strong> <strong>Telegram Notifications</strong> — Optional global setting in <strong>Agent settings</strong>: Telegram message when a device comes online. Settings persisted in <code>telegram-settings.json</code> (hot-reload); REST API <code>api/telegram/settings</code> + test endpoint; in-modal BotFather setup help.</li>
223+
<li><strong>Added:</strong> <strong>Telegram <code>/Get_info</code> Command</strong><code>TelegramCommandService</code> polls Bot API <code>getUpdates</code>; <code>/Get_info</code> requests Computer Info from an online agent (multi-device selection in chat). Responses routed via hub (<code>SendComputerInfoRequestToAgentAsync</code>, <code>telegram-</code> requestId prefix). Only the configured chat ID is accepted.</li>
224+
<li><strong>Fixed:</strong> <strong>Share Screen anonymous join</strong><code>JoinShare</code> added to hub anonymous allow-list so public viewers can connect without dashboard JWT.</li>
225+
<li><strong>Security:</strong> <strong>Replay Attack Protection (EncryptedPacket)</strong> — All incoming <code>EncryptedPacket</code> messages are now protected against replay attacks on both the BackEnd and RemoteAgent sides. A new <code>ReplayCache</code> (in-memory nonce-cache, <code>BackEnd/Security/ReplayCache.cs</code> and <code>RemoteAgent/Security/ReplayCache.cs</code>) registers the SHA-256 fingerprint of every received encrypted blob; an identical blob is rejected immediately. In addition, <code>packet.Timestamp</code> is validated against a configurable time window (default <strong>60 seconds</strong>, tunable via <code>ReplayProtection:MaxAgeSeconds</code> in <code>appsettings.json</code>) — stale packets are dropped with a warning log. Validation runs in <code>DeviceControlHub.ReceiveEncryptedFromAdmin</code>, <code>DeviceControlHub.ReceiveEncryptedFromAgent</code> and <code>SignalRService.HandleReceiveEncryptedPacketAsync</code>. AES-GCM already guaranteed confidentiality and integrity; <code>ReplayCache</code> adds <strong>freshness</strong> so a captured valid ciphertext (e.g. a shutdown or kill-process command) cannot be replayed later.</li>
226+
</ul>
227+
</div>
228+
</div>
229+
210230
<!-- VER 0.8 -->
211231
<div class="changelog-entry">
212232
<div class="changelog-version">

RemoteControl.html

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!DOCTYPE html>
1+
<!DOCTYPE html>
22
<html lang="en">
33

44
<head>
@@ -11,7 +11,7 @@
1111
<meta name="keywords"
1212
content="web remote control, Windows device management, remote automation, Mouse Bot, file transfer, ASP.NET Core, Blazor, SignalR, .NET 9, real-time monitoring, web interface, device control, remote access">
1313
<meta name="author" content=" Web Remote Screen Locker">
14-
<meta name="last-modified" content="2025-11-06">
14+
<meta name="last-modified" content="2026-07-10">
1515
<meta name="robots" content="index, follow">
1616

1717
<!-- Security Headers -->
@@ -87,7 +87,7 @@
8787
"softwareVersion": "2.7.0",
8888
"releaseNotes": "Remote control system with ASP.NET Core backend, Blazor frontend, SignalR real-time communication, and Windows agent integration",
8989
"datePublished": "2025-01-01",
90-
"dateModified": "2025-11-06"
90+
"dateModified": "2026-07-10"
9191
}
9292
</script>
9393

@@ -516,8 +516,7 @@ <h3>Live stream &amp; remote control</h3>
516516
<li>Adjustable stream quality and frame rate (up to 240 FPS)</li>
517517
<li>Dynamic zoom controls with mouse-wheel tracking</li>
518518
<li>Interactive control over SignalR for responsive remote desktop use</li>
519-
<li><strong>Share Screen:</strong> Share the live stream via a secure, public link
520-
without dashboard login</li>
519+
<li><strong>Share Screen:</strong> Share the live stream via a secure, public link without dashboard login; set a custom expiry (hours + minutes) or <strong>No time limit</strong> — expired links are automatically invalidated</li>
521520
</ul>
522521
</div>
523522

@@ -656,6 +655,37 @@ <h3>Remove agent</h3>
656655
</ul>
657656
</div>
658657

658+
<div class="feature-card">
659+
<div class="feature-icon">📡</div>
660+
<h3>Real-time device ping</h3>
661+
<p>Live round-trip latency shown for every connected agent in the device list, updated every ~10 seconds.</p>
662+
<ul class="feature-list">
663+
<li>Color-coded RTT indicator (green / yellow / red) for at-a-glance status</li>
664+
<li>Cleartext ping IDs only — no sensitive payload in the probe</li>
665+
</ul>
666+
</div>
667+
668+
<div class="feature-card">
669+
<div class="feature-icon">📲</div>
670+
<h3>Telegram notifications &amp; commands</h3>
671+
<p>Optional Telegram bot integration for instant alerts and remote queries directly from your phone.</p>
672+
<ul class="feature-list">
673+
<li><strong>Online alert:</strong> Receive a Telegram message the moment any device comes online</li>
674+
<li>Configure Bot Token and Chat ID from the Agent settings panel; includes BotFather setup help and a test message button</li>
675+
<li><strong><code>/Get_info</code> command:</strong> Send the command in your Telegram chat to fetch Computer Info from an online agent; multi-device selection when several devices are connected</li>
676+
</ul>
677+
</div>
678+
679+
<div class="feature-card">
680+
<div class="feature-icon">🕵️</div>
681+
<h3>Stealth mode</h3>
682+
<p>Hide the agent's tray icon so it runs silently in the background, visible only in the Windows Task Manager.</p>
683+
<ul class="feature-list">
684+
<li>Toggle from the Agent settings panel per device</li>
685+
<li>No system tray icon or taskbar entry — agent keeps running uninterrupted</li>
686+
</ul>
687+
</div>
688+
659689
<div class="feature-card">
660690
<div class="feature-icon">🛠️</div>
661691
<h3>Server manager</h3>
@@ -726,6 +756,10 @@ <h3 class="security-block-title">🔒 Server-Level Security</h3>
726756
<tr><td><strong>API authentication</strong></td><td>JWT Bearer token with <code>DashboardAccess</code> claim required for all admin endpoints</td></tr>
727757
<tr><td><strong>SignalR hub auth</strong></td><td><code>DashboardHubAuthorizationFilter</code> — all methods require <code>dashboard_access: true</code> claim</td></tr>
728758
<tr><td><strong>AES key validation</strong></td><td>App refuses to start if <code>AES_MASTER_KEY_HEX</code> is missing or not exactly 256 bits</td></tr>
759+
<tr><td><strong>Per-agent encryption keys</strong></td><td>Each stub built via Server Manager gets its own randomly generated AES-256 key + <code>AgentKeyId</code> registered in <code>AgentKeys.json</code> (hot-reloaded). Leaking one stub no longer exposes the traffic of every other device — the shared <code>AES_MASTER_KEY_HEX</code> remains BackEnd↔FrontEnd only</td></tr>
760+
<tr><td><strong>Per-stub connect token</strong></td><td>Each new stub receives a unique <code>AGENT_CONNECT_TOKEN</code> (256-bit random hex). The BackEnd validates it with <code>CryptographicOperations.FixedTimeEquals</code> on <code>ConnectAsDevice</code> before registering the device — preventing identity spoofing on the open hub method</td></tr>
761+
<tr><td><strong>Encrypted hub tunnel</strong></td><td>Sensitive admin↔BackEnd and agent↔BackEnd payloads travel as AES-GCM ciphertext inside generic hub targets (<code>ReceiveEncryptedFromAdmin</code>, <code>ReceiveEncryptedFromAgent</code>, <code>ReceiveEncryptedPacket</code>) — only Base64 blobs appear on the wire</td></tr>
762+
<tr><td><strong>Replay protection</strong></td><td>In-memory <code>ReplayCache</code> tracks SHA-256 fingerprints of received ciphertext blobs. Duplicate packets are rejected immediately. Combined with a 60-second <code>packet.Timestamp</code> window — stale or replayed packets (e.g. a captured shutdown command) are silently dropped on both BackEnd and RemoteAgent sides. Configurable via <code>ReplayProtection:MaxAgeSeconds</code></td></tr>
729763
<tr><td><strong>SQL injection</strong></td><td>Entity Framework Core parameterized queries only</td></tr>
730764
<tr><td><strong>Error handling</strong></td><td>Internal exception details never exposed to HTTP clients; full details in server logs only</td></tr>
731765
<tr><td><strong>Audit logging</strong></td><td>SQLite event log — action, IP, UserAgent, risk level (Low / Medium / High / Critical), PII-masked</td></tr>

0 commit comments

Comments
 (0)