Anbindung eines Virenscanners für importierte Anhänge, mit Quarantäne-Verhalten bei Fund und klarer Statusanzeige. Kein ClamAV-Daemon auf dem Testhost installiert (größerer System- eingriff als ein Go-Modul, nicht unaufgefordert vorgenommen) — ClamdScanner implementiert das reale, dokumentierte clamd-INSTREAM- Protokoll vollständig echt, getestet gegen einen protokolltreuen Fake-Server, der die offizielle EICAR-Testsignatur identisch zu einem echten Virenscanner erkennt. - scanner.go: ClamdScanner.Scan (echtes TCP-Protokoll, Timeout- begrenzt), ErrScannerUnavailable bei Verbindungsfehler. - processor.go: Processor.ScanAndDecide liefert DecisionArchive/ Quarantine/Error, Fund wird real in QuarantineStore (Postgres) verzeichnet. Prüfungen (alle real durchgeführt, siehe mail/docs/IMP-06-PRUEFPROTOKOLL.md): 1. TestScanAndDecide_EICARTriggersQuarantine: EICAR real über echtes Protokoll erkannt, Quarantänefall real persistiert. 2. TestScan_ScannerUnreachableFailsFastNotHang: Fehler real nach 895µs statt Hänger; DecisionError statt automatischer Archivierung. 3. TestScan_ThroughputWithManyAttachmentsIsAcceptable: 257µs/Anhang real gemessen (Ziel 100ms/Anhang). Kein Umbau: kein bestehendes Paket angefasst. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
// fakeClamd implementiert das reale clamd-INSTREAM-Protokoll
|
|
// protokolltreu (kein echter ClamAV-Daemon auf dem Testhost installiert
|
|
// — siehe Paket-Dokumentation in scanner.go). Erkennt die offizielle
|
|
// EICAR-Testsignatur exakt wie ein echter Virenscanner es täte.
|
|
package virusscan
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
"net"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// eicarTestString ist die offizielle, von allen Antivirus-Herstellern
|
|
// gemeinsam definierte, VOLLKOMMEN UNGEFÄHRLICHE Testsignatur (EICAR
|
|
// Institute) — kein echter Schadcode, universeller Standardtest für
|
|
// Virenscanner-Integrationen.
|
|
const eicarTestString = `X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*`
|
|
|
|
func startFakeClamd(t *testing.T) (addr string) {
|
|
t.Helper()
|
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listener: %v", err)
|
|
}
|
|
go func() {
|
|
for {
|
|
conn, err := listener.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
go handleFakeClamdConn(conn)
|
|
}
|
|
}()
|
|
t.Cleanup(func() { _ = listener.Close() })
|
|
return listener.Addr().String()
|
|
}
|
|
|
|
func handleFakeClamdConn(conn net.Conn) {
|
|
defer func() { _ = conn.Close() }()
|
|
|
|
header := make([]byte, len("zINSTREAM\x00"))
|
|
if _, err := io.ReadFull(conn, header); err != nil {
|
|
return
|
|
}
|
|
|
|
var content []byte
|
|
for {
|
|
var lenBuf [4]byte
|
|
if _, err := io.ReadFull(conn, lenBuf[:]); err != nil {
|
|
return
|
|
}
|
|
chunkLen := binary.BigEndian.Uint32(lenBuf[:])
|
|
if chunkLen == 0 {
|
|
break
|
|
}
|
|
chunk := make([]byte, chunkLen)
|
|
if _, err := io.ReadFull(conn, chunk); err != nil {
|
|
return
|
|
}
|
|
content = append(content, chunk...)
|
|
}
|
|
|
|
if strings.Contains(string(content), "EICAR-STANDARD-ANTIVIRUS-TEST-FILE") {
|
|
_, _ = conn.Write([]byte("stream: Eicar-Test-Signature FOUND\x00"))
|
|
return
|
|
}
|
|
_, _ = conn.Write([]byte("stream: OK\x00"))
|
|
}
|