LoginSignup
0
0

更にSalesforceのApex クラスをスキャンしてみる

Last updated at Posted at 2023-12-22

やっとのことで、Snyk CLIを使ってローカルに保存したApex Classのコードをスキャンすることができました...

フリープランの制限を見ているとまだスキャンできそうなので、どんな結果が返ってくるかを調べてみたいと思います。

Snyk デベロッパーセキュリティツール 料金プラン

image.png

やっと、現在のスキャン回数が分かった。

image.png

では初めてみます。

まずは認証からです。

./snyk auth

略

Your account has been authenticated. Snyk is now ready to be used.

準備できました。Apex Classをテキストファイルにコピーします。拡張子はclsです。

./snyk code test --org=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Testing C:\Users\user\Desktop\snyk ...

 ✗ [High] Server-Side Request Forgery (SSRF)
   Path: fkd_freee.cls, line 252
   Info: Unsanitized input from a SOQL statement flows into setendpoint, where it is used as an URL to perform a request. This may result in a Server-Side Request Forgery vulnerability.


✔ Test completed

Organization:      a3bd617b-f350-4a80-a2a2-abbe685121b0
Test type:         Static code analysis
Project path:      C:\Users\user\Desktop\snyk

Summary:

  1 Code issues found
  1 [High]

おおお、エラーになった。

Unsanitized input from a SOQL statement flows into setendpoint, where it is used as an URL to perform a request. This may result in a Server-Side Request Forgery vulnerability.

SOQL ステートメントからのサニタイズされていない入力は setendpoint に流れ、そこでリクエストを実行するための URL として使用されます。これにより、サーバー側のリクエスト フォージェリの脆弱性が発生する可能性があります。

ちょうどこの部分だけど、何が問題なんだろう?

image.png

同じような質問がありますが、回答を読んでも解決策は分からないですね。

他にもreq.setEndpoint(path + '?' + parameters);を使ったメソッドはあるのですが、こちらはエラーになってない。違いは直前にレコードタイプを検索するSOQLがあることくらいです。

image.png

画面からの入力された値は使っていないんですがね。SOQLとsetEndpointの組み合わせに反応しているんでしょうか?
バインド変数とかを使う必要があるのかな?

        sobject[] recordTypeList = [select Id, Name from RecordType WHERE Name = '得意先' ];
        if (acc.RecordTypeId == recordTypeList[0].Id ){
            parameters += 'keyword=' + EncodingUtil.urlEncode(acc.customer_code__c, 'UTF-8');
        } else {
            parameters += 'keyword=' + EncodingUtil.urlEncode(acc.supplier_code__c, 'UTF-8');
        }        
        HttpRequest req = new HttpRequest();
        req.setEndpoint(path + '?' + parameters);

この部分は取引先オブジェクトのレコードタイプで得意先と仕入先を別けています。それぞれコードを持っているのでレコードタイプを見てどちらかを判断しています。両方入っていることはないので、レコードタイプでの検索を止めて、acc.supplier_code__cがブランクなら得意先コード、そうでないなら仕入先コードをセットするように変えてみます。

以下のように変更してSOQLを完全になくしたのですが、同じエラーになりますね。よくわからん。

image.png

Testing C:\Users\user\Desktop\snyk ...

 ✗ [High] Server-Side Request Forgery (SSRF)
   Path: fkd_freee.cls, line 252
   Info: Unsanitized input from a SOQL statement flows into setendpoint, where it is used as an URL to perform a request. This may result in a Server-Side Request Forgery vulnerability.


✔ Test completed

Organization:      a3bd617b-f350-4a80-a2a2-abbe685121b0
Test type:         Static code analysis
Project path:      C:\Users\user\Desktop\snyk

Summary:

  1 Code issues found
  1 [High]

ソースコードを移動させたら、ターゲットのソースがないってエラーになるかと思ったのですが、同じエラーメッセージが出続けますね。どこかに覚えているのかな?

使い方がはやり分かってないです。マニュアルをちゃんと読まないといけないみたいですね。

2023/12/23 追記

PCを再起動して同じようにチェックしてみました。ソースコードは変更されているのですが、同じエラーメッセージです。 う~ん、使い方が分からない。どうも私には難しすぎて活用できないようです。残念...

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0