安全でないserverlessプラグイン:なぜソースコードを検査すべきか


Serverlessフレームワークは、多数のプラグインをサポートし、彼らは素晴らしいです!彼らは私たちのServerlessアプリケーションを展開するのに多くの時間を節約できます.なぜ車輪を再発明するか?この利便性は欠点があります:すべてのプラグインが安全に書かれていない.私たちは賢明にプラグインを選択しなければなりません.

Serverless Frameworkプラグインとは
The Serverless Framework プラグインを使うのを許してくださいlifecycle events 展開プロセス中.展開前にファイルと変数を設定する前にイベントを展開します.展開についての情報を保存するには、「deploy : finalize」フックにフックすることができます.プラグインが有効にする多くの可能性があります.
以下のプラグインがあります.
  • Create a serverless web site
  • Enabling AWS CloudFormation stack termination protection
  • Configure AWS IAM policies per function
  • そして、より多く.
    プラグインを使用するには、NPMパッケージをインストールします.
    npm install --save-dev serverless-iam-roles-per-function
    
    プラグインをサーバの設定ファイルに追加しました.serverless.yml ):
    plugins:
      - serverless-iam-roles-per-function
    
    そして、プラグインが必要なすべての指示と設定に従ってください.
    我々は今すぐ改善し、私たちのServerless展開を簡素化します.

    すべてのプラグインが同じレベルのセキュリティを持っているわけではない
    プラグインはServerlessなコミュニティによって構築されます.誰でもプラグインを作ることができます.Serverless Framework社のリストplugins , しかし、サブセットだけが「承認されます」これは、我々が使用しているものを認識しなければならないことを意味します.
    つのプラグインは、私たちは私たちの他のステートメントを追加することができますserverless.yml ファイルServerless Plugin IfElse plugin . このプラグインは、展開シナリオによってサーバーなしの設定を調整することができますので、便利です.
    たとえば、私たちは私たちに固有の機能を展開することができますdev ステージから他のものから除外する.
    service: insecure-plugins
    
    provider:
      name: aws
      runtime: nodejs12.x
      stage: ${opt:stage, 'dev'}
      region: us-east-1
    
    functions:
      dev:
        handler: dev.handler
    
    plugins:
      - serverless-plugin-ifelse
    
    custom:
      serverlessIfElse:
        - If: '"${self:provider.stage}" != "dev"'
          Exclude:
            - functions.dev
    
    我々dev ステージはdev 関数をdev ステージと他のすべてのステージはそれを持ちません.いいね
    コードを調べた後、何か面白いものを見ましたline 27 if文の評価方法.
    if (eval(item.If)) {
    
    我々が予想通りに動くかどうか見ましょう.

    プラグインを使用してexploitを起動
    更新しましたserverless.yml いくつかのノードコードを含める.
    service: insecure-plugins
    
    provider:
      name: aws
      runtime: nodejs12.x
      stage: ${opt:stage, 'dev'}
      region: us-east-1
    
    functions:
      dev:
        handler: dev.handler
    
    plugins:
      - serverless-plugin-ifelse
    
    custom:
      serverlessIfElse:
    #    - If: '"${self:provider.stage}" != "dev"'
        - If: 'const cp = require("child_process"); cp.execSync("touch hello.txt");'
          Exclude:
            - functions.dev
    
    設定を展開し、次のように注目しました.
  • 削除dev if文が真の値を返さないためです.
  • 空のファイルを見つけましたhello.txt フォルダ内.
  • これは、プラグインがどのように我々のセキュリティ姿勢を減らすことができるかの例です.与えられた、誰かが不正なコマンドを挿入する必要がありますし、このexploitのためのコードのレビュープロセスでは、過去にそれを取得します.念頭に置いておくと、プラグインコードは、Serverlessな設定を展開するために使用されるIAMポリシーによって許可されたAWSサービスへのアクセス権を持っているので、悪意を持って行うことができます.

    結論
    Serverlessのフレームワークプラグインは素晴らしいですが、ソースコードを検査することで何をするかを理解する必要があります.我々は潜在的に悪意があるかどうかを理解する必要があります.
    ソースコードを見るhttps://github.com/miguel-a-calles-mba/secjuice/tree/master/insecure-plugins .

    著者からの覚え書き
    私のメーリングリストに加わって、私の文書について最新版を受けてください.
    訪問miguelacallesmba.com/subscribe そしてサインアップ.
    滞在安全、ミゲル

    著者について
    ミゲルは主要なセキュリティエンジニアでありServerless Security 彼は開発者とセキュリティエンジニアとして複数のServerlessプロジェクトに取り組んできた.
    もともと公開Secjuice.com
    写真でDmitry Ratushny on Unsplash