ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

ВаТная Ρ‡Π°ΡΡ‚ΡŒ управлСния уязвимостями состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ поставок Ρ‚Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ПО, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… строятся соврСмСнныС систСмы. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΡŽΡ‰ΠΈΠ΅ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ΠΈ DevOps, ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ каркасы с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΈ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Но эта мСдаль ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ сторону: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² наслСдство Ρ‡ΡƒΠΆΠΈΠ΅ ошибки ΠΈ уязвимости.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π΅Π΅ прилоТСния, ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ вСрсии ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΈΠ· Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… источников, ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ вСрсии ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² послС исправлСния вновь ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… уязвимостСй.

Π’ этом постС рассмотрим использованиС OWASP Dependency Check для прСрывания сборки Π² случаС обнаруТСния ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с вашим ΠΊΠΎΠ΄ΠΎΠΌ.

Π’ ΠΊΠ½ΠΈΠ³Π΅ «Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² Agile-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…» описан Ρ‚Π°ΠΊ. OWASP Dependency Check – это бСсплатный сканСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² Π½ΠΈΡ… уязвимости. Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ вСрсии для Java, .NET, Ruby (gemspec), PHP (composer), Node.js ΠΈ Python, Π° Ρ‚Π°ΠΊΠΆΠ΅ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° C/C++. Dependency Check интСгрируСтся с распространСнными срСдствами сборки, Π² Ρ‚. Ρ‡. Ant, Maven ΠΈ Gradle ΠΈ сСрвСрами Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Jenkins.

Dependency Check сообщаСт ΠΎΠ±ΠΎ всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… с извСстными уязвимостями ΠΈΠ· ΠΠ°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… уязвимос­тСй (NVD) NIST ΠΈ обновляСтся Π½Π° основании Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· новостных ΠΊΠ°Π½Π°Π»ΠΎΠ² NVD.

По ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, всС это ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ автоматичСски с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΈΡ… инструмСнтов, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ OWASP Dependency Check, ΠΈΠ»ΠΈ коммСрчСских ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ‚ΠΈΠΏΠ° Black Duck, JFrog Xray, Snyk, Nexus Lifecycle ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Sonatype ΠΈΠ»ΠΈ SourceClear.

Π­Ρ‚ΠΈ инструмСнты ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² сборочныС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ автоматичСски ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ опись зависимостСй с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, содСрТащиС извСстныС уязвимости, ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ сборку Π² случаС обнаруТСния ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

OWASP Dependency Check

Для тСстирования ΠΈ дСмонстрации Ρ€Π°Π±ΠΎΡ‚Ρ‹ Dependency Check ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ dependency-check-example.

Для просмотра HTML ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ web-сСрвСр nginx Π½Π° вашСм gitlab-runner.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ минимального ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° nginx:

server {
    listen       9999;
    listen       [::]:9999;
    server_name  _;
    root         /home/gitlab-runner/builds;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

Π’ ΠΊΠΎΠ½Ρ†Π΅ сборки Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ:

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ссылкС ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚ Dependency Check.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ β€” вСрхняя Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° с ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ содСрТаниСм.

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ подробности CVE-2017-5638. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ CVE ΠΈ ссылки Π½Π° эксплоиты.

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ β€” подробности log4j-api-2.7.jar. Π’ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΡƒΡ€ΠΎΠ²Π½ΠΈ CVE 7.5 ΠΈ 9.8.

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ β€” подробности commons-fileupload-1.3.2.jar. Π’ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΡƒΡ€ΠΎΠ²Π½ΠΈ CVE 7.5 ΠΈ 9.8.

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gitlab pages, Ρ‚ΠΎ Π½Π΅ получится β€” ΡƒΠΏΠ°Π²ΡˆΠ°Ρ таска Π½Π΅ создаст Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ здСсь https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Π’Ρ‹Π²ΠΎΠ΄ сборки: Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² Π½Π΅Ρ‚, html ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π½Π΅ Π²ΠΈΠΆΡƒ. Надо ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Artifact: always

https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

Π Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ уровня CVE уязвимостСй

Бамая главная строка Π² Ρ„Π°ΠΉΠ»Π΅ gitlab-ci.yaml:

mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ failBuildOnCVSS Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ CVE уязвимостСй, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ с ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… уязвимос­тСй (NVD) NIST

Π’Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ постоянно скачиваСт Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… уязвимос­тСй (NVD) NIST с ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°:

ИспользованиС сканСра уязвимостСй Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Dependency-Check Π² GitlabCI

Для скачивания ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ nist_data_mirror_golang

Установим ΠΈ запустим Π΅Π΅.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nist_data_mirror_golang
yum -y install nist-data-mirror
systemctl start nist-data-mirror

Nist-data-mirror Π·Π°ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ CVE JSON NIST Π² /var/www/repos/nist-data-mirror/ ΠΏΡ€ΠΈ запускС ΠΈ обновляСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 24 часа.

Для скачивания CVE JSON NIST Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ web-сСрвСр nginx (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° вашСм gitlab-runner).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ минимального ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° nginx:

server {
    listen       12345;
    listen       [::]:12345;
    server_name  _;
    root         /var/www/repos/nist-data-mirror/;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку Π³Π΄Π΅ запускаСтся mvn вынСсСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ DEPENDENCY_OPTS.

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ .gitlab-ci.yml получится Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

variables:
  MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
  DEPENDENCY_OPTS: "-DfailBuildOnCVSS=7 -DcveUrlModified=http://localhost:12345/nvdcve-1.1-modified.json.gz -DcveUrlBase=http://localhost:12345/nvdcve-1.1-%d.json.gz"

cache:
  paths:
    - .m2/repository

verify:
  stage: test
  script:
    - set +e
    - mvn $MAVEN_CLI_OPTS install org.owasp:dependency-check-maven:check $DEPENDENCY_OPTS || EXIT_CODE=$?
    - export PATH_WITHOUT_HOME=$(pwd | sed -e "s//home/gitlab-runner/builds//g")
    - echo "************************* URL Dependency-check-report.html *************************"
    - echo "http://$HOSTNAME:9999$PATH_WITHOUT_HOME/target/dependency-check-report.html"
    - set -e
    - exit ${EXIT_CODE}
  tags:
    - shell

Telegram Ρ‡Π°Ρ‚ ΠΏΡ€ΠΎ DevOps and Security
Telegram ΠΊΠ°Π½Π°Π» DevSecOps / SSDLC -БСзопасная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com