GraphSQLとセキュリティ含意


Amateurs hack systems, professionals hack people.


私たちのコントロールを超えている生活の中で多くのものがあります.これらのうちの1つは、我々全員が攻撃に弱いという事実です.それが人生の一部であるので、これは我々が受け入れなければならなくて、対処することを学ぶ何かです.多くの異なる種類の脆弱性があります、そして、我々の各々は我々自身のユニークなセットを持ちます.
他の人が感情的であるか精神的な攻撃に対してより脆弱である間、一部の人々は身体的な攻撃により弱いです.
(もしあなたが弱いなら😜 私たちに星を与えましょうhttps://github.com/blst-security/cherrybomb )

人間として、コンピュータは物理的な搾取に弱いです.
私たちは皆、脆弱性を持っています.
私たちの仕事は表面攻撃を減らすことです.
以前は、Graphqlを紹介し、どのように動作するかを説明しました.
この記事では、セキュリティ上の欠陥に焦点を当て、具体的な例が続きます.

セキュリティ欠陥


新しい技術が新しい脆弱性をもたらすウェブ上のGraphqlの人気が高まっていることで、私は、グラフィカルSQLの実装でしばしば見落とされる特定のタイプの脆弱性について話したいです.デフォルトでは、Qraphqlは認証を実装しません.つまり、デフォルトでは、GraphSQLは誰でもそれを問い合わせることができます.すべての機密情報は攻撃者に認証されません.

どのような攻撃の種類?


任意のAPI技術として、GraphSQLはcommon API vulnerability .
しかし、この記事では、私はより特定されます.
詳しくは飛び込みましょう

偵察・内省


GraphSQLは内省的です.
したがって、最初のステップは通常、スキーマのコピーを取得するために、イントロスペクションクエリを実行することです.スキーマは、露出したGraphSQL APIの攻撃面を理解するのに役立ちます.
任意の攻撃を試みる前に、すべてのフィールドの名前と型を取得することをお勧めします.query{__schema{types{name,fields{name}}}}データベースの問い合わせ方法を理解するには、次のコマンドを使用し、すべての型と引数を展開します.query{__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}

列挙


今、私たちはデータのアーキテクチャを理解しています.
あなたが列挙を開始するとき、データがリークするかもしれないので、出力に目を離さないでください.また、存在しないフィールドで問い合わせを試み、サーバから有用な情報を受け取ることを望みます.あなたはキウイを使用することができます.GraphSQLクエリがどのように動作し、データを抽出するかを理解するために.

また、渡すと、特定の都市を検索することができます引数として、都市の値として検索します.

あなたはもっと基本的な情報を取得したい場合は、私の前をチェックすることができます.

認証脆弱性


前に述べたように、GraphSQLはデフォルトで認証を実装しません.
さらに、GraphSQLは1つのAPIリクエストでログインすることができます.この攻撃は「バッチング・ブルートフォース」と命名されます
このアプローチは、外部のセキュリティ監視を無駄にすることはない.
ブルートフォースログインの簡単な例:入力パラメータは資格情報の値を持つ必要があります.

このテクニックをブルートフォース2 faにも使えます.

でのSQL注入


注入攻撃は、悪意のあるコードが脆弱な入力フィールド(例えばフォームフィールド)に注入されて、それからアプリケーションによって実行される一種の攻撃です.注射攻撃は、敏感なデータへのアクセスを得て、任意のコードを実行するか、他の悪意ある行動を実行するために、アプリケーションの脆弱性を利用するのに用いられることができます.

SQLの注入は非常によく知られているが、それはまた、我々のコンテキストで発生することができます.
文字列型のフィールドは、文字列注入の候補となります.また、id default scalarが文字列と同じ方法でシリアライズされていることに注意してください.
type Post {
    id: ID
    title: String
    content: String
}

type Query {
    post(id: ID): Post
}
リゾルバのバックエンドリクエスト:
function post({ id }) {
    return query('SELECT * FROM POSTS WHERE id = ' + id);
}
注:' or '1'='1この場合、1 = 1は常にtrueです、したがって、サーバーはすべての既存のポストを返します.私は、あなたがチェックすることができる改善に対処しませんOWASP article それについて.

GrapfのCSRF


CSRFはクロスサイトリクエストforgeryの頭字語です.悪意のあるWebサイト、電子メール、ブログ、インスタントメッセージ、またはプログラムがユーザーのWebブラウザにユーザーが現在認証されている信頼されたサイトに不要なアクションを実行させるときに発生する攻撃の種類です.一般的に、Graphqlは通常、アプリケーションの状態を変更するために使用されるPOSTリクエストを使用します.しかし、GraphSQLのエンドポイントは、コンテンツタイプがアプリケーション/JSONに設定されていることを受け入れます.一見、Graphqlはこのタイプの攻撃に対して無敵であるようですが、真実のGraphql実装はしばしばCSRFによって影響を受けます.コンテンツタイプにプレーン/プレーンに変更するだけで、ミドルウェアはアプリケーション/JSONに変換する必要があります.
別の問題は、ChromeブラウザがデフォルトでSamesite 属性がLAXに設定された場合、ブラウザはGETリクエストに対してのみクッキーを送信します.それで、あなたはCSRFトークンなしで構成されて、Content - Typeを変えているGraphSQL終点を見つけると言いましょう、最後のことはパスクロムメカニズムによってGET Requestとしてそれを送るように試みることです.
実際には問題ではなく、GraphSQLはGETリクエストを介して突然変異を許します.

横断攻撃


アクセス制御リストがうまく構成されていない場合は、トラバース攻撃が発生します.攻撃のこのタイプは非常に簡単ですが、見つけるのは簡単ではない.
ユーザーと顧客との例を挙げましょう.
{
    user {
        id
        username
        customers {
            id
            username
        }
    }
}
ここでは、顧客のIDとユーザー名を取得するために、認証ユーザーのIDとユーザ名から取得する単純なリクエストです.
デフォルトでは、ユーザーは彼の顧客だけを得るために認可されます.
しかし、認証済みのユーザーが顧客の顧客を取得しようとする場合は?
{
    user {
        id
        username
        customers {
            id
            username
        customers{
            id
            username
           } 
        }
    }
}
悪い構成では、認証されたユーザーは、すべての顧客と顧客を取得することができます.
このタイプの攻撃からGraphSQLを確保するのはかなり難しいようです.
Graphqlクエリと変数の両方のユーザー入力を検証するときにホワイトリストアプローチを使用するよう提案します.このタイプの攻撃を防ぐためのパラメータです.
おもしろいarticle それは詳細について話します.

壊れたオブジェクトレベル承認


壊れたオブジェクトレベル認証は、オブジェクトが読み込み、書き込み、実行などのアクションを実行する許可を与えられたときです.壊れたオブジェクトレベル承認は、オブジェクトが動作を実行するために正しい許可を持っていないときです.オブジェクトのパーミッションが正しく設定されていない場合、またはオブジェクトが作成されたときにオブジェクトが正しいアクセス許可を与えられない場合に起こります.

OWASP APIセキュリティトップ10はbolaを持っています
認可がGraphSQLデベロッパーのために明示的に開発者の頭痛である前に私が言ったように、壊れているオブジェクトレベル認可.Pen Testのテストでは、GraphSQL APIは常にユーザーがリソースにアクセスする権限を持っているかどうかをチェックします.
壊れたオブジェクトレベル承認を軽減する多くの方法があります.一般的な方法はいくつかあります:
-ユーザーが必要なリソースにアクセスできるだけの最小特権モデルを実装します.
-アクセス制御リスト( ACL )を使用して、どのユーザーがどのリソースにアクセスできるかを明示的に定義します
-ユーザーアクティビティを監視し、異常または不正アクセスを探します.
- DAST (動的アプリケーションテスト)を使用してシステムを定期的に監査するCherryBomb あなたのAPIを論理的欠陥に対して監査するための有用なCLIツール.

故障率制限


Grapql APIの複雑さが増大するにつれて、サービス拒否攻撃を防ぐことがより困難になります.残りのAPIはHTTPリクエストの数を制限しますが、GraphSQLクエリは多くのアクションをとります.HTTPリクエストの数を制限するREST APIのレート制限戦略は、Grapql APIを保護するのに十分ではありません.
このタイプのサービス拒否攻撃に対して防御する2つの一般的な方法があります.最初のオプションは再帰の深さを制限することです.その結果、大きな結果の結果を返すクエリは拒否されます.第2の解は、複雑さスコアリングシステムを実行することになっている.許容される最大値より大きい全複雑さによるどんな要請も拒絶されます.

APIゲートウェイとしてのGraphSQL


APIゲートウェイや他のAPIやマイクロサービスのプロキシとして使用されるGraphSQLサーバーを見るのは一般的です.
GraphSQLインターフェイスは、内部APIへのフロントエンドインターフェイスとして機能します.
不正に実装された場合、攻撃者はパラメータを注入したり、バックエンドAPIへのパスを変更することができます.
別のユーザープロファイルを取得するエンドポイントのシナリオを見てみましょう.
type Query {
    me: User!
    userID(id: ID!):User
}
type User {
    id: ID!
    name: String!
    Users: [User!]!
}
リゾルバは次のようになります.
export const userID = async (id: string) => {
    let results = await req.get(`http://api.com/user/${id}`);
    return results.data;
}
IDパラメタに「4/delete/」を注入することによって、バックエンドAPIはこのように要求を翻訳するかもしれません:GET http://api.com/user/4/deleteこの場合、これらの問題を緩和するために、変数がまさにあなたが予想するものであることを確認して、下にあるシステムを利用しようとしていません.
その後の要求、データベースクエリなどに注入する前に、入力を確認するために正規表現パターンやその他の規則を定義することができます.
Graphqlは人気が高まっているので、組織がこの技術を使用することに関係する潜在的なセキュリティリスクを認識することが重要です.適切な認証と承認をこれらのリスクを緩和するために実装する必要があります.クライアントの入力を正しく検証するのと同様に、適切な認証と認可措置を実施することによって、組織はこれらのリスクを軽減するのを助けることができます.

最後に


GraphSQLはAPI設計のための新しい標準になるか、新しいフォント終わりAPIになる可能性があります、しかし、それは軽減される必要がある若干の固有の危険を持ちます.