Bonjour,
Petite aventure ce jour avec mon instance Peertube en 8.1.5. Activité CPU suspecte sur mon serveur maison dont le ventilateur tournait à fond (je l’entends au travers du meuble dans lequel il est placé, ce qui est inhabituel). Connexion en SSH pour voir et en effet c’est confirmé avec btop/htop : 12 de load average pour 4 cœurs. Il y a plein de process ffmpeg :
peertube 2516857 2516817 34 16:21 ? 00:00:02 /usr/bin/ffmpeg -i /var/www/peertube/storage/streaming-playlists/hls/8ef8091a-b0af-49f6-9375-3ed1efca38a8/8ef8091a-b0af-49f6-9375-3ed1efca38a8-1080-fragmented.mp4 -threads 1 -map 0 -c copy -movflags frag_every_frame+empty_moov -min_frag_duration 5M -f mp4 pipe:
peertube 2516861 2516817 39 16:21 ? 00:00:03 /usr/bin/ffmpeg -i /var/www/peertube/storage/streaming-playlists/hls/c970b7f9-1078-4dd7-a3b5-8e1ad9e30f8e/c970b7f9-1078-4dd7-a3b5-8e1ad9e30f8e-1080-fragmented.mp4 -threads 1 -map 0 -c copy -movflags frag_every_frame+empty_moov -min_frag_duration 5M -f mp4 pipe:
peertube 2516862 2516817 15 16:21 ? 00:00:01 /usr/bin/ffmpeg -i /var/www/peertube/storage/streaming-playlists/hls/974393b7-d3ba-4948-9f1e-50f2a591205f/201d005e-7d3a-4cbe-8fdc-132ea0d65dc5-1080-fragmented.mp4 -threads 1 -map 0 -c copy -movflags frag_every_frame+empty_moov -min_frag_duration 5M -f mp4 pipe:
peertube 2516895 2516817 27 16:21 ? 00:00:02 /usr/bin/ffmpeg -i /var/www/peertube/storage/tmp/fe5c1d61-aa5c-4deb-a9fe-159ee564d1f2.mp4 -i pipe:0 -threads 1 -map 0 -map 1 -c copy -movflags frag_every_frame+empty_moov -min_frag_duration 5M -f mp4 pipe:1
peertube 2516902 2516817 45 16:21 ? 00:00:02 /usr/bin/ffmpeg -i /var/www/peertube/storage/streaming-playlists/hls/3ef6735b-fb31-4c5d-a02d-cf2936f254fd/3ef6735b-fb31-4c5d-a02d-cf2936f254fd-720-fragmented.mp4 -threads 1 -map 0 -c copy -movflags frag_every_frame+empty_moov -min_frag_duration 5M -f mp4 pipe:1
Ces process ne viennent pas de tâches de transcodage… rien là dessus dans les tâches d’administration sur Peertube. Après killall, de nouveaux process ffmpeg reviennent… Je regarde dans le log nginx, je grep sur “generate”. IP du Bengladesh, Pakastin, Brésil, Kosovo, Vietnam…
123.19.205.139 - - [09/May/2026:16:32:16 +0200] « HEAD /download/videos/generate/37d2f763-fe2b-4f7b-9356-474e6166a270?videoFileIds=991051&videoFileIds=991055 HTTP/1.1 » 499 0 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_9) AppleWebKit/539.13 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/539.13 Edg/105.0.5420.51 »
177.47.229.12 - - [09/May/2026:16:32:19 +0200] « HEAD /download/videos/generate/3ef6735b-fb31-4c5d-a02d-cf2936f254fd?videoFileIds=498788 HTTP/1.1 » 499 0 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/586.16 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/586.16 Edg/105.0.4364.79 »
192.228.99.238 - - [09/May/2026:16:32:21 +0200] « GET /download/videos/generate/bd145472-1003-49bf-a483-f8f472e08a3c?videoFileIds=562087 HTTP/1.1 » 200 3603421 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_11) AppleWebKit/581.5 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/581.5 Edg/105.0.2930.12 »
Je constate que certains retours HTTP sont de taille importante. Comme 31882758 = 31Mo, 12729239 = 12Mo. Je ne sais pas ce que fait cette API : /download/videos/generate/
Dans le doute je prend une URL au hasard dans le log et je teste dans mon navigateur, je constate que cela me renvoi une vidéo .mp4 complète qui n’est pas de mon instance mais d’une autre.
Je comprend qu’en gros, un leecher passe par mon instance Peertube pour récupérer les vidéos d’une autre instance. Simple volonté de DDOS ? J’ai placé temporairement un filtre sur nginx pour mitiger cela :
location ~* ^/download/videos/generate/* {
deny all;
}
→ systemctl reload nginx pour prise en compte. Le résultat est immédiat, retours HTTP 403.
200.219.49.193 - - [09/May/2026:16:35:28 +0200] « GET /download/videos/generate/db34d995-7cc8-4d23-b4b6-1ca87da48690?videoFileIds=613787 HTTP/1.1 » 403 548 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/600.4 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/600.4 Edg/105.0.2803.76 »
109.107.243.60 - - [09/May/2026:16:35:28 +0200] « GET /download/videos/generate/d926dbf2-8170-4b6c-b60f-5fe0c53b1bcd?videoFileIds=802984 HTTP/1.1 » 403 548 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/552.10 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/552.10 Edg/105.0.1551.33 »
113.168.240.156 - - [09/May/2026:16:35:30 +0200] « GET /download/videos/generate/db34d995-7cc8-4d23-b4b6-1ca87da48690?videoFileIds=613787 HTTP/1.1 » 403 548 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/600.4 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/600.4 Edg/105.0.2803.76 »
Tentative un peu plus tard…
- - [09/May/2026:16:42:16 +0200] « GET /download/videos/generate/d9f3314c-b525-4cf7-90a1-464d3f2ce63c?videoFileIds=998077 HTTP/3.0 » 403 548 « - » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 OPR/131.0.0.0 »
- - [09/May/2026:16:42:16 +0200] « GET /download/videos/generate/baff9807-f24b-4819-b53e-009c75e86915?videoFileIds=993977 HTTP/3.0 » 403 548 « - » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 OPR/131.0.0.0 »
Cette fonctionnalité /download/videos/generate/ est utilisée dans quel cadre publiquement ? Merci d’avance.
Soyez vigilants.