我正在尝试使用apache 2.4,php 5.6上的clamav扫描文件(通常为100MB + zips),使用套接字来访问clamav-daemon。我没有使用PHP-FPM。 (p.s.套接字有效,我可以发送PING并获得PONG)。
def return_locals_rpc_decorator(fun):
def decorated_fun(*args, **kw):
local_args = fun(*args, **kw)
# pickle the local_args and send it to server
# server unpickle and doing the RPC
# fetch back server results and unpickle to results
return rpc_results
return decorated_fun
@return_locals_rpc_decorator
def rpc_fun(a, b, c=3):
return locals() # This looks weird. how can I make this part of the decorator?
print(rpc_fun(2, 1, 6))
上传文件会产生:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
if (isset($_FILES['file']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if(socket_connect($socket, '/var/run/clamav/clamd.ctl')) {
$result = "";
$file = $_FILES['file']['tmp_name'];
socket_send($socket, "SCAN $file", strlen($file) + 5, 0);
socket_recv($socket, $result, 20000, 0);
var_dump($result);
}
socket_close($socket);
}
?>
<form method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit"></form>
在我看来,这似乎是一个权限错误(即使/ tmp是string(65) "/tmp/phpxYBjyS: lstat() failed: No such file or directory. ERROR "
)。但我可能是错的。我无法轻易查看该文件,因为在php进程完成后文件被删除。
drwxrwxrwt 9 root root 4096 Dec 4 13:10 tmp
,在命令行,当然是有效的(例如clamdscan
)。
我的/tmp/virus.txt: Eicar-Test-Signature FOUND
仍然是默认值。它看起来像这样:
/etc/clamav/clamd.conf
/编辑 尝试使用exec而不是套接字。
LocalSocket /var/run/clamav/clamd.ctl
FixStaleSocket true
LocalSocketGroup clamav
LocalSocketMode 666
# TemporaryDirectory is not set to its default /tmp here to make overriding
# the default with environment variables TMPDIR/TMP/TEMP possible
User clamav
AllowSupplementaryGroups true
ScanMail true
ScanArchive true
ArchiveBlockEncrypted false
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogSyslog false
LogRotate true
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly false
SelfCheck 3600
Foreground false
Debug false
ScanPE true
MaxEmbeddedPE 10M
ScanOLE2 true
ScanPDF true
ScanHTML true
MaxHTMLNormalize 10M
MaxHTMLNoTags 2M
MaxScriptNormalize 5M
MaxZipTypeRcg 1M
ScanSWF true
DetectBrokenExecutables false
ExitOnOOM false
LeaveTemporaryFiles false
AlgorithmicDetection true
ScanELF true
IdleTimeout 30
CrossFilesystems true
PhishingSignatures true
PhishingScanURLs true
PhishingAlwaysBlockSSLMismatch false
PhishingAlwaysBlockCloak false
PartitionIntersection false
DetectPUA false
ScanPartialMessages false
HeuristicScanPrecedence false
StructuredDataDetection false
CommandReadTimeout 5
SendBufTimeout 200
MaxQueue 100
ExtendedDetectionInfo true
OLE2BlockMacros false
ScanOnAccess false
AllowAllMatchScan true
ForceToDisk false
DisableCertCheck false
DisableCache false
MaxScanSize 100M
MaxFileSize 25M
MaxRecursion 16
MaxFiles 10000
MaxPartitions 50
MaxIconsPE 100
PCREMatchLimit 10000
PCRERecMatchLimit 5000
PCREMaxFileSize 25M
ScanXMLDOCS true
ScanHWP3 true
MaxRecHWP3 16
StatsEnabled false
StatsPEDisabled true
StatsHostID auto
StatsTimeout 10
StreamMaxLength 25M
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0
Bytecode true
BytecodeSecurity TrustSigned
BytecodeTimeout 60000
这也会产生类似的错误
if (isset($_FILES['file']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
$path = escapeshellarg($_FILES['file']['tmp_name']);
$code = -1;
$result = '';
exec('clamdscan ' . $path, $result, $code);
if ($code !== 0) {
var_dump($result);
}
}
答案 0 :(得分:0)
这看起来像是 Moodle 在使用 systemd PrivateTmp 的服务下运行。
许多发行版现在为 apache 和 php-fpm 等服务配置 systemd 单元,为服务提供自己的私有 tmp 目录(至少部分出于安全原因)。
如果您查看 apache 或 php-fpm 的 systemd 单元文件(在 /lib/systemd/system
下查找名为 apache2.service
、httpd.service
或 php-fpm.service
之类的文件),您可能会在 PrivateTmp=true
部分看到 [Service]
行。
覆盖此文件的最佳方法(如果您决定需要这样做)是在服务的相关 /etc/systemd/systemd/
子目录中创建覆盖文件。您可以将 systemctl edit
用于相关服务,例如systemctl edit php-fpm.service
如果在 RHEL 上的 php-fpm 下运行。 apache2 的服务名称会有所不同,具体取决于您使用的发行版。
覆盖文件应该只包含:
# A comment to explain why you're doing this
[Service]
PrivateTmp=false
您可能还需要将 clamd 正在运行的用户添加到网络服务器组,以便在它实际看到临时文件时授予它访问临时文件的权限,例如usermod -a -G apache clamscan
在 RHEL 上。