aaPanel_Kern Hier der Text zum Kopieren:
Hi Kern,
I followed your suggestion and checked whether the code is actually used. It is. Here is what I verified on my own server, aaPanel 8.0.5, file dated 2026-07-30 - so this is the current shipping version, not an old one.
1. The cloud detector is wired into the active scanner, unconditionally.
safecloudModel.py
973: class main
988: self.__detectors = [
991: YaraDetector(), # comment in your code: rule package deleted, pending fix
992: CloudDetector() # cloud scan engine
993: ]
1180: def scan_file(self, file_path)
1200: is_suspicious, rule = detector.detect(file_path) # every detector
1450: is_suspicious, rule = self.scan_file(file_path) # scan loop
2233: is_suspicious, rule = self.scan_file(file_path) # second call site
CloudDetector appears exactly twice in the whole file: the class definition and line 992. There is no config flag, no if, no switch anywhere in that path.
2. It has demonstrably run on my machine, not just been "written but unused".
/www/server/panel/data/safeCloud/cloud_config.json written 2026-07-14 22:48:07
{"last_check": 1784062087.55, "check_url": "http://w-check.bt.cn/check.php"}
This file is only created by _save_cache(), which is only called after _update_check_url() successfully contacted checkWebShell.php. Its existence is proof that the cloud path executed.
3. Your node still hands out a valid upload target today.
GET https://webshellcheck.aapanel.com/checkWebShell.php
→ {"url": "http://w-check.bt.cn/check.php", "status": true}
GET https://sg1-webshellcheck.aapanel.com/checkWebShell.php
→ {"url": "http://w-check.bt.cn/check.php", "status": true}
Identical to what was cached three weeks ago. If the feature were inactive, status: false from your own node would have been enough to stop it - no code release needed.
4. What is transmitted is the full file, as form data.
POST http://w-check.bt.cn/check.php
Content-Type: application/x-www-form-urlencoded
inputfile=<entire file content>&md5=<md5>
ReadFile() (line 538) opens in text mode and returns fp.read() - the complete file, no truncation. The md5 is sent in addition to, not instead of, the content. The response is reduced to a single value: result['data']['data']['level'] == 5.
So my three original questions are answered by your own code: yes the path executes, yes the body contains the content, and a transfer that is evaluated and discarded is still a transfer.
My new question is a different one.
The panel uses https:// for all nine nodes in NODES_CONFIG - www, api, download, node, wafapi, wafapi2, w-check, webshellcheck, geterror. The client is clearly capable of TLS. But the upload target your node returns is plain http://.
I checked whether that endpoint could accept TLS at all:
157.255.129.252:80 TCP open
157.255.129.252:443 TCP open, but TLS handshake fails
SSL alert 112 "unrecognized name", no peer certificate available
So:
Why is customer file content - application source code, and on a multi-tenant host potentially files containing personal data - transmitted over unencrypted HTTP, when every other panel node uses HTTPS?
This is not a detail. Under GDPR Art. 32 a controller must ensure appropriate security of processing, and transmitting third-party personal data in cleartext across the public internet is difficult to defend as appropriate - independently of the consent question in my first post. Anyone on the path can read the content, and the endpoint resolves to a network in Guangdong (China Unicom), which for EU operators also raises Chapter V transfer questions.
Concretely:
- Will the returned URL be switched to HTTPS, and by when?
- Until then, will you make
status: false the default from checkWebShell.php, so no content leaves servers that never opted in?
- Is the content stored or logged at the endpoint, and for how long?
I am happy to be corrected on any of the code readings above - every line number is from the file as shipped in 8.0.5, and I can provide the full context on request.
Thanks!