diff --git a/php/containers.json b/php/containers.json index a63f5d16..08d81047 100644 --- a/php/containers.json +++ b/php/containers.json @@ -418,7 +418,7 @@ "CHOWN" ], "cap_drop": [ - "NET_RAW" + "ALL" ] }, { diff --git a/php/src/Container/Container.php b/php/src/Container/Container.php index 6b6c5af9..5a357783 100644 --- a/php/src/Container/Container.php +++ b/php/src/Container/Container.php @@ -27,6 +27,8 @@ readonly class Container { public bool $enableNvidiaGpu, /** @var string[] */ public array $capAdd, + /** @var string[] */ + public array $capDrop, public int $shmSize, public bool $apparmorUnconfined, /** @var string[] */ diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php index 44ab329e..32b35bc7 100644 --- a/php/src/ContainerDefinitionFetcher.php +++ b/php/src/ContainerDefinitionFetcher.php @@ -308,6 +308,11 @@ readonly class ContainerDefinitionFetcher { $capAdd = $entry['cap_add']; } + $capDrop = []; + if (isset($entry['cap_drop'])) { + $capDrop = $entry['cap_drop']; + } + $shmSize = -1; if (isset($entry['shm_size'])) { $shmSize = $entry['shm_size']; @@ -370,6 +375,7 @@ readonly class ContainerDefinitionFetcher { $devices, $enableNvidiaGpu, $capAdd, + $capDrop, $shmSize, $apparmorUnconfined, $backupVolumes, diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php index 539f01db..686288e0 100644 --- a/php/src/Docker/DockerActionManager.php +++ b/php/src/Docker/DockerActionManager.php @@ -401,8 +401,11 @@ readonly class DockerActionManager { $requestBody['HostConfig']['CapAdd'] = $capAdds; } - // Disable arp spoofing - if (!in_array('NET_RAW', $capAdds, true)) { + $capDrops = $container->capDrop; + if (count($capDrops) > 0) { + $requestBody['HostConfig']['CapDrop'] = $capDrops; + } else if (!in_array('NET_RAW', $capAdds, true)) { + // Prevent ARP spoofing by default $requestBody['HostConfig']['CapDrop'] = ['NET_RAW']; } @@ -463,9 +466,11 @@ readonly class DockerActionManager { // Special things for the collabora container which should not be exposed in the containers.json } elseif ($container->identifier === 'nextcloud-aio-collabora') { if (!$this->configurationManager->collaboraSeccompDisabled) { - // Load reference seccomp profile for collabora + // Load reference seccomp profile for collabora... $seccompProfile = (string)file_get_contents(DataConst::GetCollaboraSeccompProfilePath()); $requestBody['HostConfig']['SecurityOpt'] = ["label:disable", "seccomp=$seccompProfile"]; + // ...which allows the collabora container to run without any capabilities + $requestBody['HostConfig']['CapAdd'] = []; } // Additional Collabora options