HOW TO USE: https://github.com/EmptyCode0x86/Web-Remote-Control-System/blob/main/README.md
CHANGELOG:
10/07/2026
VER: 0.9
- Added: Share Link Expiry — Live Stream share links can now have a configurable lifetime. In the stream toolbar, set Hours and Minutes or enable No time limit. The backend registers sessions in
ShareSessionService;ShareExpiryServiceexpires them and notifies viewers viaShareExpired. Admin UI shows a countdown while sharing. Server validates links onJoinShareandBroadcastSharedFrame(1 min – 7 days, or unlimited). - Added: Real-time Device Ping —
DevicePingServicepings connected agents every 10 s; agents respond withPong; RTT is shown in the connected devices list (PingMs, color-coded). Cleartext ping IDs only (no sensitive payload). - Added: Telegram Notifications — Optional global setting in Agent settings: Telegram message when a device comes online. Settings persisted in
telegram-settings.json(hot-reload); REST APIapi/telegram/settings+ test endpoint; in-modal BotFather setup help. - Added: Telegram
/Get_infoCommand —TelegramCommandServicepolls Bot APIgetUpdates;/Get_inforequests Computer Info from an online agent (multi-device selection in chat). Responses routed via hub (SendComputerInfoRequestToAgentAsync,telegram-requestId prefix). Only the configured chat ID is accepted. - Fixed: Share Screen anonymous join —
JoinShareadded to hub anonymous allow-list so public viewers can connect without dashboard JWT. - Security: Replay Attack Protection (EncryptedPacket) — All incoming
EncryptedPacketmessages are now protected against replay attacks on both the BackEnd and RemoteAgent sides. A newReplayCache(in-memory nonce-cache,BackEnd/Security/ReplayCache.csandRemoteAgent/Security/ReplayCache.cs) registers the SHA-256 fingerprint of every received encrypted blob; an identical blob is rejected immediately. In addition,packet.Timestampis validated against a configurable time window (default 60 seconds, tunable viaReplayProtection:MaxAgeSecondsinappsettings.json) — stale packets are dropped with a warning log. Validation runs inDeviceControlHub.ReceiveEncryptedFromAdmin,DeviceControlHub.ReceiveEncryptedFromAgentandSignalRService.HandleReceiveEncryptedPacketAsync. AES-GCM already guaranteed confidentiality and integrity;ReplayCacheadds freshness so a captured valid ciphertext (e.g. a shutdown or kill-process command) cannot be replayed later. - Security: ConnectAsDevice bypass fix — Fixed a security vulnerability in
DeviceControlHub.ConnectAsDevice. WhenAgentSecurity:RequireConnectTokenwas set totrue, an attacker could bypass the enforcement by sending any unknownagentKeyId—TryGetConnectTokenreturnedfalsefor the unknown ID, causing the code to skip token validation and allow the connection as a legacy agent. Added anelse if (requireToken)branch inside theagentKeyIdblock: ifagentKeyIdis provided but not found in theAgentKeys.jsonregistry in strict mode, the connection is now rejected withHubException("Unauthorized")and a warning is logged (ConnectAsDevice: unknown agentKeyId rejected). The attacker would still need the sharedAES_MASTER_KEY_HEXto communicate, but theRequireConnectTokenenforcement now correctly covers all cases.