まったり技術ブログ

Webエンジニアのセキュリティブログ

『不信なPoCは実行するな』というお話【セキュリティ】

f:id:motikan2010:20200526225913p:plain:w600

はじめに ~ 脆弱性PoCの収集リポジトリ ~

 私は脆弱性のPoCが自動的に収集しているリポジトリを公開していますが、先日このようなIssueが作成されました。

そのIssueの内容を端的に言うと「収集しているPoCにマルウェアが混ざってるでボケェ!!」というもの。

f:id:motikan2010:20200526205425p:plain:w600

正体はマルウェアだったリポジトリ

 ここでは「CVE-2020-0883」「CVE-2020-0910」の2つの脆弱性があげられており、それぞれ「thelostworldFree/CVE-2020-0883」「inetshell/CVE-2020-0910」リポジトリのことを指していると考えられます。

 実際にこの2つのリポジトリ内のコードを確認してみます。異なる脆弱性のPoCですが、Pythonコードがほぼ同じであり非常に怪しいリポジトリであることが分かります。

f:id:motikan2010:20200526221446p:plain

 そのコードの詳細はテンセント社のブログで紹介されていたのでそちらを参照ください。(中国語ですが・・・)

上記の2つとは別の脆弱性(CVE-2020-0796 : Microsoft SMBv3の脆弱性)で説明されていますが、コードの動作内容は同じなので問題ないです。

cloud.tencent.com

 (※以下、Google翻訳を駆使して理解できた内容です。)
 この記事を簡単に説明すると、

・この怪しいコードは実行時に指定した「検査対象となるホスト」情報を54[.]184[.]20[.]69に送信するような動作したそうです。
・そして送信されたホスト情報に対して外部かSMBパケットが送信されたそうです。

 明らかに脆弱性検証コードの動作ではなく、黒なコードであったことが確認できます。

まとめ ~ 無闇にPoCを実行してはイカン!! ~

 つまり何が言いたいかというと、信用できないPoCを安易に実行してはいけないということです。
今エンジニアとして働いている私にとっては当然のことではありますが、学生の頃は適当に見つけたPoCを実行するようなことがありました。(不思議と.exe等の実行ファイルは怪しんでいましたが...)
そんなPoCの内容を一切確認しない人を標的としているんでしょうね。

 そんな感じでPoCを実行するときは、コードをしっかり確認した方がいいよという記事でした。

軽くコードを見るだけでも分かる場合がほとんどです(今回の様に不明な難読化をしていたり)。
ちなみにコードを読んでもよく分からん時はとりあえず実行しないようにしています(or 死んでもいい環境で動かしたり)。

 下画像のようにIssue内で「このリポジトリが怪しい」ということを教えてくれる場合もあるようです。
f:id:motikan2010:20200526224312p:plain:w600

 感覚的となりますが、他PoCリポジトリよりスター数が多いリポジトリは正当なPoCリポジトリと判断して良さそうです。

更新履歴

  • 2020年5月26日 新規作成

【Azure】Azure CLIでApplication Gateway WAFを操作 - カスタムルール編

f:id:motikan2010:20200424002556p:plain:w500

はじめに

 本記事では Application Gateway WAF のポリシーやカスタムルールの制御(作成・削除など)を azコマンド経由で実行する方法を説明します。

Azure CLI(azコマンド)で Application Gateway WAF を操作

1. WAFポリシー

$ az network application-gateway waf-policy -h

Group
    az network application-gateway waf-policy : Manage application gateway web application firewall
    (WAF) policies.

Subgroups:
    custom-rule    : Manage application gateway web application firewall (WAF) policy custom rules.
    managed-rule   : Manage managed rules of a waf-policy. Visit: https://docs.microsoft.com/en-
                     us/azure/web-application-firewall/afds/afds-overview.
    policy-setting : Defines contents of a web application firewall global configuration.

Commands:
    create         : Create an application gateway WAF policy.
    delete         : Delete an application gateway WAF policy.
    list           : List application gateway WAF policies.
    show           : Get the details of an application gateway WAF policy.
    update         : Update an application gateway WAF policy.
    wait           : Place the CLI in a waiting state until a condition of the application gateway
                     WAF policy is met.

1-1. WAFポリシーの作成 (create サブコマンド)

 createサブコマンドのヘルプ

$ az network application-gateway waf-policy create -h

Command
    az network application-gateway waf-policy create : Create an application gateway WAF policy.

Arguments
    --name -n           [Required] : The name of the application gateway WAF policy.
    --resource-group -g [Required] : Name of resource group. You can configure the default group
                                     using `az configure --defaults group=<name>`.
    --location -l                  : Location. Values from: `az account list-locations`. You can
                                     configure the default location using `az configure --defaults
                                     location=<location>`.
    --tags                         : Space-separated tags: key[=value] [key[=value] ...]. Use '' to
                                     clear existing tags.

Examples
    Create an application gateway WAF policy. (autogenerated)
        az network application-gateway waf-policy create --name MyApplicationGatewayWAFPolicy
        --resource-group MyResourceGroup
$ az network application-gateway waf-policy create \
--name TestPolicy \
--resource-group testResourceGroup

1-2. WAFポリシーの詳細表示 (show サブコマンド)

 showサブコマンドのヘルプ

$ az network application-gateway waf-policy show \
  --resource-group 'testResourceGroup' \
  --name 'TestPolicy'

----- 出力 -----
{
  "applicationGateways": null,
  "customRules": [],
  "etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
  "httpListeners": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testResourceGroup/providers/Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/TestPolicy",
  "location": "japaneast",
  "managedRules": {
    "exclusions": [],
    "managedRuleSets": [
      {
        "ruleGroupOverrides": [],
        "ruleSetType": "OWASP",
        "ruleSetVersion": "3.0"
      }
    ]
  },
  "name": "TestPolicy",
  "pathBasedRules": null,
  "policySettings": {
    "fileUploadLimitInMb": 100,
    "maxRequestBodySizeInKb": 128,
    "mode": "Detection",
    "requestBodyCheck": true,
    "state": "Disabled"
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "testResourceGroup",
  "resourceState": null,
  "tags": null,
  "type": "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies"
}
---------------

2. カスタムルール

$ az network application-gateway waf-policy custom-rule -h

Group
    az network application-gateway waf-policy custom-rule : Manage application gateway web
    application firewall (WAF) policy custom rules.

Subgroups:
    match-condition : Manage application gateway web application firewall (WAF) policies.

Commands:
    create          : Create an application gateway WAF policy custom rule.
    delete          : Delete an application gateway WAF policy custom rule.
    list            : List application gateway WAF policy custom rules.
    show            : Get the details of an application gateway WAF policy custom rule.
    update          : Update an application gateway WAF policy custom rule.

2-1. カスタムルールの作成 (create サブコマンド)

 createサブコマンドのヘルプ

$ az network application-gateway waf-policy custom-rule create -h

Command
    az network application-gateway waf-policy custom-rule create : Create an application gateway WAF
    policy custom rule.

Arguments
    --action            [Required] : Action to take.  Allowed values: Allow, Block, Log.
    --name -n           [Required] : Name of the WAF policy rule.
    --policy-name       [Required] : The name of the application gateway WAF policy.
    --priority          [Required] : Rule priority. Lower values are evaluated prior to higher
                                     values.
    --resource-group -g [Required] : Name of resource group. You can configure the default group
                                     using `az configure --defaults group=<name>`.
    --rule-type         [Required] : Type of rule.  Allowed values: Invalid, MatchRule.

 ポリシー「TestPolicy」にカスタムルール「TestCustomRule」を作成。

$ az network application-gateway waf-policy custom-rule create \
  --action 'Block' \
  --name 'TestCustomRule' \
  --policy-name 'TestPolicy' \
  --priority '50' \
  --resource-group 'testResourceGroup' \
  --rule-type 'MatchRule'

----- 出力 -----
{
  "action": "Block",
  "etag": null,
  "matchConditions": [],
  "name": "TestCustomRule",
  "priority": 50,
  "ruleType": "MatchRule",
  "skippedManagedRuleSets": []
}
---------------

2-2. カスタムルールの削除 (delete サブコマンド)

 deleteサブコマンドのヘルプ

$ az network application-gateway waf-policy custom-rule delete -h

Command
    az network application-gateway waf-policy custom-rule delete : Delete an application gateway WAF
    policy custom rule.

Arguments

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : Name of the WAF policy rule.
    --policy-name       : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.

 リソースグループ「testResourceGroup」のポリシー「TestPolicy」内のカスタムルール「TestCustomRule」を削除。

$ az network application-gateway waf-policy custom-rule delete \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule'

2-3. カスタムルールの一覧 (list サブコマンド)

 listサブコマンドのヘルプ

$ az network application-gateway waf-policy custom-rule list \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy'

----- 出力 -----
[
  {
    "action": "Block",
    "etag": null,
    "matchConditions": [
      {
        "matchValues": [
          "hoge",
          "fuga"
        ],
        "matchVariables": [
          {
            "selector": null,
            "variableName": "QueryString"
          },
          {
            "selector": null,
            "variableName": "PostArgs"
          }
        ],
        "negationConditon": false,
        "operator": "Contains",
        "transforms": [
          "Lowercase",
          "RemoveNulls"
        ]
      }
    ],
    "name": "TestCustomRule",
    "priority": 50,
    "ruleType": "MatchRule",
    "skippedManagedRuleSets": []
  }
]
---------------

2-4. カスタムルールの詳細 (show サブコマンド)

 カスタムルールを指定して詳細を確認することができます。

 showサブコマンドのヘルプ

$ az network application-gateway waf-policy show -h

Command
    az network application-gateway waf-policy show : Get the details of an application gateway WAF
    policy.

Arguments

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.

Global Arguments
    --debug             : Increase logging verbosity to show all debug logs.
    --help -h           : Show this help message and exit.
    --only-show-errors  : Only show errors, suppressing warnings.
    --output -o         : Output format.  Allowed values: json, jsonc, none, table, tsv, yaml,
                          yamlc.  Default: json.
    --query             : JMESPath query string. See http://jmespath.org/ for more information and
                          examples.
    --verbose           : Increase logging verbosity. Use --debug for full debug logs.

Examples
    Get the details of an application gateway WAF policy. (autogenerated)
        az network application-gateway waf-policy show --name MyApplicationGatewayWAFPolicy
        --resource-group MyResourceGroup

 カスタムルール「TestCustomRule」の詳細を出力してみます。

$ az network application-gateway waf-policy custom-rule show \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule'

----- 出力 -----
{
  "action": "Block",
  "etag": null,
  "matchConditions": [
    {
      "matchValues": [
        "hoge",
        "fuga"
      ],
      "matchVariables": [
        {
          "selector": null,
          "variableName": "QueryString"
        },
        {
          "selector": null,
          "variableName": "PostArgs"
        }
      ],
      "negationConditon": false,
      "operator": "Contains",
      "transforms": [
        "Lowercase",
        "RemoveNulls"
      ]
    }
  ],
  "name": "TestCustomRule",
  "priority": 50,
  "ruleType": "MatchRule",
  "skippedManagedRuleSets": []
}
--------------------

2-5. カスタムルールの更新 (update サブコマンド)

$ az network application-gateway waf-policy custom-rule update -h

Command
    az network application-gateway waf-policy custom-rule update : Update an application gateway WAF
    policy custom rule.

Arguments
    --action            : Action to take.  Allowed values: Allow, Block, Log.
    --priority          : Rule priority. Lower values are evaluated prior to higher values.
    --rule-type         : Type of rule.  Allowed values: Invalid, MatchRule.

Generic Update Arguments
    --add               : Add an object to a list of objects by specifying a path and key value
                          pairs.  Example: --add property.listProperty <key=value, string or JSON
                          string>.
    --force-string      : When using 'set' or 'add', preserve string literals instead of attempting
                          to convert to JSON.
    --remove            : Remove a property or an element from a list.  Example: --remove
                          property.list <indexToRemove> OR --remove propertyToRemove.
    --set               : Update an object by specifying a property path and value to set.  Example:
                          --set property1.property2=<value>.

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : Name of the WAF policy rule.
    --policy-name       : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.

3. マッチ条件

$ az network application-gateway waf-policy custom-rule match-condition -h

Group
    az network application-gateway waf-policy custom-rule match-condition : Manage application
    gateway web application firewall (WAF) policies.

Commands:
    add    : A match condition to an application gateway WAF policy custom rule.
    list   : List application gateway WAF policy custom rule match conditions.
    remove : Remove a match condition from an application gateway WAF policy custom rule.

3-1. マッチ条件を追加 (add サブコマンド)

$ az network application-gateway waf-policy custom-rule match-condition add -h

Command
    az network application-gateway waf-policy custom-rule match-condition add : A match condition to
    an application gateway WAF policy custom rule.

Arguments
    --match-variables [Required] : Space-separated list of variables to use when matching. Variable
                                   values: RemoteAddr, RequestMethod, QueryString, PostArgs,
                                   RequestUri, RequestHeaders, RequestBody, RequestCookies.
    --operator        [Required] : Operator for matching.  Allowed values: BeginsWith, Contains,
                                   EndsWith, Equal, GeoMatch, GreaterThan, GreaterThanOrEqual,
                                   IPMatch, LessThan, LessThanOrEqual, Regex.
    --values          [Required] : Space-separated list of values to match.
    --negate                     : Match the negative of the condition.  Allowed values: false,
                                   true.
    --transforms                 : Space-separated list of transforms to apply when matching.
                                   Allowed values: HtmlEntityDecode, Lowercase, RemoveNulls, Trim,
                                   UrlDecode, UrlEncode.

Resource Id Arguments
    --ids                        : One or more resource IDs (space-delimited). It should be a
                                   complete resource ID containing all information of 'Resource Id'
                                   arguments. If provided, no other 'Resource Id' arguments should
                                   be specified.
    --name -n                    : Name of the WAF policy rule.
    --policy-name                : The name of the application gateway WAF policy.
    --resource-group -g          : Name of resource group. You can configure the default group using
                                   `az configure --defaults group=<name>`.
    --subscription               : Name or ID of subscription. You can configure the default
                                   subscription using `az account set -s NAME_OR_ID`.

 実際に以下の表のマッチ条件を作成してみます。

マッチ条件
Match variable ["QueryString", "PostArgs"]
Operator "Contains"
Match values ["hoge", "fuga"]
Transformations ["Lowercase", "RemoveNulls"]
$ az network application-gateway waf-policy custom-rule match-condition add \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule' \
  --match-variables 'QueryString' 'PostArgs' \
  --operator 'Contains' \
  --values 'hoge' 'fuga' \
  --transforms 'Lowercase' 'RemoveNulls'

-----  出力 -----
{
  "matchValues": [
    "hoge",
    "fuga"
  ],
  "matchVariables": [
    {
      "selector": null,
      "variableName": "QueryString"
    },
    {
      "selector": null,
      "variableName": "PostArgs"
    }
  ],
  "negationConditon": null,
  "operator": "Contains",
  "transforms": [
    "Lowercase",
    "RemoveNulls"
  ]
}
---------------

 Azureのダッシュボード から作成されたことが確認できました。
f:id:motikan2010:20200424004319p:plain:w300

3-2. マッチ条件の一覧 (list サブコマンド)

$ az network application-gateway waf-policy custom-rule match-condition list \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule'

----- 出力 -----
[
  {
    "matchValues": [
      "hoge",
      "fuga"
    ],
    "matchVariables": [
      {
        "selector": null,
        "variableName": "QueryString"
      },
      {
        "selector": null,
        "variableName": "PostArgs"
      }
    ],
    "negationConditon": false,
    "operator": "Contains",
    "transforms": [
      "Lowercase",
      "RemoveNulls"
    ]
  }
]
---------------

3-3. マッチ条件を削除 (remove サブコマンド)

$ az network application-gateway waf-policy custom-rule match-condition remove -h

Command
    az network application-gateway waf-policy custom-rule match-condition remove : Remove a match
    condition from an application gateway WAF policy custom rule.

Arguments
    --index  [Required] : Index of the match condition to remove.

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : Name of the WAF policy rule.
    --policy-name       : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.
$ az network application-gateway waf-policy custom-rule match-condition remove \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule' \
  --index 0

Githubスターが100超えたから紹介【セキュリティ】

はじめに

 先日私が作成したGitHubリポジトリのスター数が100を超えました!圧倒的感謝!(-人-)謝謝

100個を超えたことに気づいている様子が以下のツイートです。

ちなみに記念すべき100個目のスターは自分で付けようと思っていましたが、就寝中であったため付けられませんでした。(¦3ꇤ[▓▓]

 そして本記事ではこのリポジトリがどのようリポジトリであるのかを紹介します。

 ついでに私が管理しているセキュリティ関連のリポジトリもいくつか紹介します!(+α 私自身のリポジトリ参照頻度でオススメ度も記載します)

 日々セキュリティ情報を収集している方にはきっと役に立つはずです。

「PoC-in-GitHub」とはどのようなリポジトリ? [ オススメ度:★★★☆ ]

 下のリポジトリがそれです。

github.com

 一言でリポジトリを説明すると、
    Github上にある脆弱性PoC(Proof of Concept)のリポジトリが列挙されている
 となります。

 収集の仕組みとしては、GitHub API で「CVE-1999- ~CVE-2020-」を自動的に検索してそれをまとめているだけです。

仕組みは単純ですが、数時間前に作成されたPoCに気づくこともあるのでなかなか便利です。
(Forkしている人はなんなんだろ・・・)

その他リポジトリも紹介させて!

 上記リポジトリのように セキュリティ情報 を自動的に収集してまとめているリポジトリは他にも3つあるので紹介します。

NVD情報を保存している「NVD-Database」 [ オススメ度:★☆☆☆ ]

github.com

 NVD情報をダウンロードして格納しているリポジトリです。
このようなリポジトリは他に結構存在しているので説明は割愛。

 作成当初は定期的に内容を確認しようと考えていましたが、追記・変更量的が多すぎるので1度もまともに確認したことないです。

CVEをリスト化している「CVE-Easy-List」 [ オススメ度:★★★★ ]

 CVE情報を収集している CVEProject/cvelist をリスト化しているリポジトリです。
ステータスが PUBLIC となってCVEのみをリスト化しており、昨日パブリックになったCVEを確認したい時などに重宝しています。

github.com

 Github上のDIFFで確認するようにしており、新規にパブリックになった脆弱性は一目瞭然です。(もちろんCVE-IDが未採番の脆弱性は載っていないです)

 頻繁に確認するようにしているリポジトリです。皆さんは直近に公開されたCVE情報を確認するとき、どのようにしているんでしょうね?

CVEのExploitがリスト化されている「NVD-Exploit-List-Ja」 [ オススメ度:★★☆☆ ]

github.com

 NVD内には Exploit タグが付いているリンクがあります。それらのリンクをリスト化しているリポジトリです。

 JVN(Japan Vulnerability Notes)の情報も用いており、JVNに存在するCVEに関しては日本語の説明を表示するようにしています。

 以上、紹介したのがセキュリティ情報を収集しているリポジトリです。

まだ4つしかないので、今後もいろいろ作成していく予定です。直近ではCVE IDが採番されていない脆弱性を収集したリポジトリを作成する予定です。

おまけ

裏方アカウント

 紹介したリポジトリを管理しているアカウントです。

 GitHubには「無料アカウントを複数個所有してはいけない」という有名な利用規約があるので、このアカウントを作成時にメインアカウントを有料プランに移行したりしました。

 自動で情報を追記しているので管理しているので草生えまくりです。この草の状態が死活監視対象となっていたり。
コミットの草を見てみると 平日の草が濃い ようにみえる。やはり休日の脆弱性の更新は減り気味なのかね?

脆弱性をリスト化することによる副作用

 脆弱性がCVE単位で詳細に管理されているサイトとして Vulmon があります。

 このようなサイトには脆弱性の詳細情報が記載されているサイトへのリンクが当然のように存在しています。

 詳細情報には脆弱性の詳細情報が記載されているGitHubへのリンクも含まれていますが、脆弱性の詳細が記載されていない私のリポジトリへのリンクもあったりします。(自動収集だからかと考えられます)

 荒らしているような感じがして、罪悪感があったりなかったり・・・。

まとめ

一旦紹介はこんな感じです。

 これらのリポジトリは私自身が便利だと感じており、どこかのタイミングで紹介しようと考えていましたので、スター数が100個というキリ良いタイミングで紹介できてよかったです。

 本来は50個で紹介記事を書こうと思っていました。そのタイミングを逃した時は次のキリのよいタイミングは100個ということで、いつになることやらと思っていましたが、結構早めに迎えることができうれしいです。

 余談として、私はスターが増える毎に過敏に反応しており、スターを付けたアカウントをチェックしていたりします。
それらのアカウントのプロフィールをみる限り中国語圏の方がほどんどで、中国圏の方々は脆弱性情報好きすぎだとと気づいた次第です。

 次は情報を集めたリポジトリではなく、ライブラリなどのプログラムでスターを集めてみたい。

更新履歴

  • 2020年3月5日 新規作成

【Webセキュリティ】Apache Dubbo の脆弱性をやる(CVE-2019-17564)

f:id:motikan2010:20200214224225p:plain
  • はじめに
    • Apache Dubbo とは
      • 脆弱性について
    • 影響を受けるバージョン
    • 解決策
  • 検証環境の準備
    • Apache ZooKeeper を起動
    • アプリケーションの修正と起動
  • 脆弱性の検証
    • ysoserial を使ってペイロードを生成
    • ペイロードの中身を確認
    • ペイロードの送信
    • 修正版 2.7.5 で試してみる
  • 参考
  • 更新履歴

はじめに

 2020年2月10日にApache Dubbo の脆弱性が公表されました。
CVE-2019-17564が登録されたのは2019年10月14日のようです。

 本脆弱性の内容を一言で言うと、「安全でないデシリアライゼーションのJava版」です。

 こちらのメールにて Dubboプロジェクトチーム に対して本脆弱性が伝えられています。
https://www.mail-archive.com/dev@dubbo.apache.org/msg06225.html

 CVE STALKER のデイリーランキングでは7位になっています。
f:id:motikan2010:20200214001856p:plain:w600

続きを読む

【Python】Waitress の ReDoS をやってみる(CVE-2020-5236)

f:id:motikan2010:20200205224320p:plain
いらすとや産のPython

  • はじめに
    • Waitress とは
  • 検証
    • 検証バージョン
    • 環境構築
    • ReDoS をしてみる
      • 脆弱なバージョン 1.4.2
      • パッチ適用バージョン 1.4.3
      • 脆弱性が存在しないバージョン 1.4.1
  • 脆弱性を掘り下げる
    • 修正コミット
    • 修正前 と 修正後 の正規表現
      • 簡単に負荷の大きい正規表現を試す
    • 遅い原因を考えてみる
  • 参考
    • 本脆弱性の情報
    • ReDoSの情報
  • 更新履歴

はじめに

 GitHub Advisory Database - CVE-2020-5236緊急度が Critical(最も危険) となっていたので調べてみました。

f:id:motikan2010:20200205214545p:plain:w700
GitHub アドバイザリ - CVE-2020-5236

 影響を受ける Waitress のバージョンは1.4.2のみです。
リリースのタイムラインは以下のようになっています。2020年1月中に導入した人はバージョンを確認してみたほうがよいでしょう。(※本脆弱性以外にも過去のバージョンには他の脆弱性が見つかっているようでした。)

  • 1.4.2 2020年 1月 2日 リリース
  • 1.4.3 2020年 2月 2日 リリース

Waitress — waitress 1.4.3 documentation

Waitress とは

 あまり耳にしないソフトウェアだと思う「Waitress」は何かと言うと、「WSGI サーバ」らしい。

 WSGI サーバとは何ぞやというと、

Web Server Gateway Interface (WSGI; ウィスキー) は、プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション(もしくはWebアプリケーションフレームワーク)を接続するための、標準化されたインタフェース定義である。

by Wikipedia

つまり、
  Django や Bottle といったPython言語のWebアプリケーションフレームを動作させる為のアプリケーションサーバとのこと。
 Ruby界隈で例えると Unicorn に近い役割を持っているWebサーバだと思う。

 WSGI サーバーについてのより詳しい内容は以下の記事が参考になりました。
WSGIアプリケーションとは?WebフレームワークからWSGIサーバーまで - Make組ブログ

 今回脆弱性が発見された「Waitress」はそのようなソフトウェアの1つということです。

 どのくらい普及しているのかというと、GitHub の 約12,800個のリポジトリで利用されていることから、そこそこ普及しているWebサーバだと思います。

f:id:motikan2010:20200205215037p:plain:w700
2020/2/5 現在

 そんな Waitress から ReDoS(Regular expression Denial of Service) の脆弱性が発見されました。
本脆弱性の再現には特別な設定等は必要なく、さらに攻撃方法が容易ということで簡単に再現してしまうことから緊急度が Critical となっていると思います。

github.com

続きを読む

【Webセキュリティ】依存ライブラリのセキュリティチェックツール(SCA)を使ってみる

f:id:motikan2010:20200129012730p:plain
  • はじめに
  • 言語別 ツール一覧
    • PHP
      • sensiolabs / security-checker
        • 使い方
        • 脆弱性データベース
        • Web版
    • Ruby
      • rubysec / bundler-audit
        • 使い方
      • 脆弱性データベース - rubysec / ruby-advisory-db
    • Python
      • pyupio / safety
        • 脆弱性データベース
        • 使い方
        • 詳細情報レポートの取得。 --full-report オプション
    • Java
      • jeremylong / DependencyCheck
      • Gradle用 jeremylong/dependency-check-gradle
    • JavaScript
      • Npm標準ツール - npm-audit
        • 脆弱なパッケージをアップデートする " npm audit fix " コマンド
  • まとめ
  • 更新履歴

はじめに

 まず「依存ライブラリのセキュリティチェックツール」とは?ということですが、このようなツールの呼び方が定まっていないため本記事ではこのような呼び方にしています。
(強いて言えば、Software Composition Analysツールと呼ばれているツール群)

これらのツールの特徴として、動作しているアプリケーションが依存しているライブラリやパッケージに既知の脆弱性が存在していないかをバージョン情報などをもとに検査します。脆弱性があるバージョンのライブラリがあるとアラートを出す挙動をします。

 従来から利用されている Burp Suite や OWASP ZAP などのWebセキュリティ診断ツールは実際にアプリケーションを動作させて、その挙動から脆弱性を検出します。それに対して「依存ライブラリのセキュリティチェックツール」はアプリケーションを動作させずに検査します。ツールの動作が全く異なるので、検査内容も大きく違います。

 どちらかといったらWordPressの検査に利用される WPScan に検査内容は近いです。どちらも利用しているプラグイン(ライブラリ)のバージョン情報で検出するのがメインとなっているからです。
それでも検査を実施できる範囲は異なります。
 WPScan はネット越しに公開されているサイト全てに検査することが可能です。対して「依存ライブラリのセキュリティチェックツール」はアプリケーションが依存しているライブラリが記述されているファイル(Gemfile.lock や composer.lock)が検査対象になりますので、それらのファイルを閲覧できる権限者のみが検査を実施できます。それらのファイルに依存関係はほぼ全て記述されているので、依存関係を全て取得するのが難しいネット越しでの検査に比べてより厳密な検査ができます。

 そして近頃、Webアプリケーションなどのソフトウェアに依存しているライブラリに既知の脆弱性が潜んでいないかを検査するために、セキュリティチェックツールを提供・利用するサービスが増えてきている気がしています。

▼ Snyk もセキュリティチェックツールを開発/提供している企業であり資金調達が上手くいっている模様。 jp.techcrunch.com

 まずは、手軽に導入することができるOSSのセキュリティチェックツールを使用してみて、どのような検査結果を得ることができるのかなどを確認してみます。
ついでに検出された脆弱性の情報はどこから取得しているのかなども確認してきます。

続きを読む

2018年 人気脆弱性 TOP 10 in GitHub

  • はじめに
  • TOP 10
    • 10位 541 ポイント 『Intel Core マイクロプロセッサを搭載したシステムにおける情報漏えいに関する脆弱性(CVE-2018-3620 通称「Foreshadow」)』
    • 9位 575 ポイント 『Intel ハードウェアアーキテクチャのデバッグ例外を適切に処理していない問題(CVE-2018-8897)』
    • 8位 582 ポイント 『WinRAR における入力確認に関する脆弱性(CVE-2018-20250)』
    • 7位 592 ポイント 『TBK DVR4104 および DVR4216 デバイスにおける証明書・パスワードの管理に関する脆弱性(CVE-2018-9995)』
    • 6位 605 ポイント 『Microsoft Exchange Server における権限を昇格される脆弱性(CVE-2018-8581)』
    • 5位 627 ポイント『OpenSSH における情報漏えいに関する脆弱性(CVE-2018-15473)』
    • 4位 674 ポイント 『Apache Struts2 における任意のコードが実行可能な脆弱性(CVE-2018-11776、S2-057)』
    • 3位 946 ポイント『複数の Microsoft Windows 製品における権限を昇格される脆弱性(CVE-2018-8120)』
    • 2位 1236 ポイント『Drupal における入力確認に関する脆弱性(CVE-2018-7600 通称「Drupalgeddon2」)』
    • 1位 1242 ポイント『libssh における認証に関する脆弱性(CVE-2018-10933)』
    • TOP 10 一覧
    • おまけ
      • リポジトリ数ランキング
  • 更新履歴

はじめに

 2020年 1発目の投稿となりますが、時代に逆行して2018年に人気だった脆弱性を紹介します。
先日書いた「2019年 人気脆弱性 TOP 10 in GitHub」の2018年版です。

↓ 2019年版 ↓
blog.motikan2010.com

TOP 10

 TOP 10の算出方法としては、「リポジトリの数」と「それらのリポジトリのスターの数」を使用しています。
リポジトリ毎に10ポイント、スター毎に1ポイント 加算される形式で算出しています。
 ※各脆弱性のタイトルはJVNから引用しています。

10位 541 ポイント 『Intel Core マイクロプロセッサを搭載したシステムにおける情報漏えいに関する脆弱性(CVE-2018-3620 通称「Foreshadow」)』

access.redhat.com

人気リポジトリ
GitHub - ionescu007/SpecuCheck: SpecuCheck is a Windows utility for checking the state of the software mitigations and hardware against CVE-2017-5754 (Meltdown), CVE-2017-5715 (Spectre v2), CVE-2018-3260 (Foreshadow), and CVE-2018-3639 (Spectre v4)

続きを読む

2019年 人気脆弱性 TOP 10 in GitHub

  • はじめに
  • TOP 10
    • 10位 501 ポイント『Pulse Secure Pulse Connect Secure におけるパーミッションに関する脆弱性(CVE-2019-11510)』
    • 9位 522 ポイント『Canonical snapd における入力確認に関する脆弱性(CVE-2019-7304)』
    • 8位 545 ポイント『Firefox および Thunderbird における入力確認に関する脆弱性(CVE-2019-11708)』
    • 7位 572 ポイント『Android 用 ES File Explorer File Manager アプリケーションにおける入力確認に関する脆弱性(CVE-2019-6447)』
    • 6位 629 ポイント『Espressif ESP-IDF および ESP8266_NONOS_SDK における入力確認に関する脆弱性(CVE-2019-12586)』
    • 5位 704 ポイント『Oracle Fusion Middleware の Oracle WebLogic Server における WLS Core Components に関する脆弱性(CVE-2019-2618)』
    • 4位 785 ポイント『Docker および runc におけるコンテナエラーの脆弱性(CVE-2019-5736)』
    • 3位 935 ポイント『Oracle Fusion Middleware の Oracle WebLogic Server における Web Services に関する脆弱性(CVE-2019-2725)』
    • 2位 1868 ポイント『PHP における境界外書き込みに関する脆弱性(CVE-2019-11043)』
    • 1位 5413 ポイント『複数の Microsoft Windows 製品のリモートデスクトップ サービスにおけるリモートでコードを実行される脆弱性(CVE-2019-0708 通称「BlueKeep」)』
    • TOP 10 一覧
  • おまけ
    • リポジトリ数ランキング
  • 更新履歴

はじめに

 2019年も終わりに近づいているので、2019年に公表されたCVEが採番されている脆弱性の中から人気なものをGitHubから検索しTOP 10を決めていきます。

検索結果のリポジトリについては下記のリポジトリで管理されています。
github.com

TOP 10

 TOP 10の算出方法としては、「リポジトリの数」と「それらのリポジトリのスターの数」を使用しています。
リポジトリ毎に10ポイント、スター毎に1ポイント 加算される形式で算出しています。
 ※各脆弱性のタイトルはJVNから引用しています。

10位 501 ポイント『Pulse Secure Pulse Connect Secure におけるパーミッションに関する脆弱性(CVE-2019-11510)』

jp.tenable.com

攻撃者はユーザー名とプレーンテキストパスワードを取得するためにCVE-2019-11510を使用して脆弱性のあるシステムを探し出しています。

とある通り、任意のファイルが取得できる脆弱性となっています。

Twitter社にも該当する脆弱性があったようですね。 Twitterも影響を受けたSSL VPN製品の脆弱性についてまとめてみた - piyolog

こちらの脆弱性はBlack Hat 2019でも触れられていた脆弱性でした。 https://i.blackhat.com/USA-19/Wednesday/us-19-Tsai-Infiltrating-Corporate-Intranet-Like-NSA.pdf

人気リポジトリ
GitHub - projectzeroindia/CVE-2019-11510: Exploit for Arbitrary File Read on Pulse Secure SSL VPN (CVE-2019-11510)

続きを読む

PHP-FPM RCE(CVE-2019-11043)の攻撃をAWS WAFでブロック

  • はじめに
  • AWS WAFの設定
    • 文字列マッチの条件を作成
    • ルールを作成
    • ACLにルールを追加
  • 攻撃がブロックされることを確認
  • 参考
  • 更新履歴

はじめに

 先日、PHP-FPMにRCEの脆弱性(CVE-2019-11043)があることが公表されました。

 脆弱性の詳細について本記事で説明しません。脆弱性を含んでいるバーションや攻撃が可能となる条件等は下のリンクの記事を参照して下さい。

 本記事では、この脆弱性に対しての攻撃をブロックするAWS WAFのルールの作成方法を紹介します。
「PHPのアップデート」や「Nginxの設定変更」での対応ができない環境下での対応手段の1つだと思っています。

ブロックのルールはシンプルですので、AWS WAF以外の製品にも適用できるとも考えています。

jp.tenable.com

続きを読む

Laravelで学ぶ「安全でないデシリアライゼーション」

  • はじめに
  • 環境
  • 事前知識
    • 1つのPHPファイルでやってみる
    • なぜOSコマンドが実行されたのか
    • なにが問題なのか
  • Laravel でやってみる
    • 修正内容
    • 脆弱性の確認
    • OSコマンド呼び出し部分の確認
      • Illuminate/Broadcasting/PendingBroadcast クラス
      • Faker/Generator クラス
  • PHPGGC(PHP Generic Gadget Chains)
    • PoCを出力する
  • 対策
    • unserialize関数に渡す値はバリデーションを行う
    • allowed_classesオプションの付与(※非推奨な対策)
  • まとめ
  • 更新履歴

はじめに

 OWASP Top 10 - 2017に「A8:安全でないデシリアライゼーション」がありますが、この脆弱性が顕在化 することは少なく、あまり身近ではないかなと感じています。ということで今回は本脆弱性がどういったものなのかを簡単に手元で試すことができるLaravelを用いて説明します。
 PHPオブジェクトインジェクション(PHP Object Injection)を試すことになります。

続きを読む

【セキュリティ】motikan2010作サイト『オープンハニーポット』とは

※金欠の為、当サービスは終了いたしました。


  • はじめに
  • どのようなサイト?
  • 各画面の説明
    • トップ
    • リクエスト一覧
    • リクエスト詳細
    • 時間別アクセス数
    • 日別アクセス数
    • ログイン画面
  • 今後
  • 参考
  • 更新履歴

はじめに

 前回のブログ更新から1ヶ月以上経ち、たまには更新をしないといけないと思ったので最近私が作成したサイトを簡単に紹介することにします。
 その名は『オープンハニーポット』!!
 まだ β版 ということで挙動がおかしい部分がありますが、興味のある方は是非さわってみてください。

http://honypot.motikan2010.com/honypot.motikan2010.com

どのようなサイト?

ハニーポットという名が入っていることからもわかる通り、ハニーポットに関係しているサイトです。
 このサイトには私が運用している複数のハニーポットのアクセスログが保存されており、誰でもそのログを閲覧することができます。ちなみに今は4台のハニーポットからログを収集しています。

 その4台上で動作しているハニーポットは全て同じですが、動作させているクラウドサービスがそれぞれ異なっており、「AWS」「GCP」「Azure」「Alibaba Cloud」を利用しています。
 その意図としては、クラウドサービスごとに攻撃の種類が異なるのかを観測したかったというのがあります。(実際は軽く確認した感じ、差異はありませんでした・・・)

 「オープンハニーポット」では、それらのハニーポットで収集されたアクセスログの詳細や時間別のアクセス数などを確認することができます。

続きを読む

CVE-2019-11581 - 「Atlassian JIRA サーバーサイド・テンプレート・インジェクション」について調べてみた

  • はじめに
  • 概要
    • 脆弱性についてより詳しく
  • 検証情報(キャプチャ画像有り)
    • PoC(検証コード)
    • 検証
      • 検証パッケージ(Jira Server 7.13.4)
      • Jira Server インストール手順(AWS)
    • 攻撃可能な設定
  • 対応
  • まとめ
  • 追記
  • 更新履歴

はじめに

 プロジェクト管理ツールとし有名な Jira Server の脆弱性が見つかりました。

 脆弱性を含んでいるバージョンを利用しているかつ、特定の設定を有効にしている場合に、未ログインユーザでも「サーバーサイド・テンプレート・インジェクション(server-side template injection)」攻撃が可能ということで少し調べてみました。

 Poc も存在しており、実際にその検証している様子もありますので、Jiraサイトをパブリックに公開している運用している場合には、バージョンの確認・設定の確認をしてみたほうがよいでしょう。

続きを読む