問題タブ [windows-firewall-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
370 参照

c# - .Net Core 3.1 で NetFwTypeLib を使用するとメモリ リークが発生する

私が取り組んでいるこの IDS/IPS トラフィック モニタ コンソール アプリでのメモリ リークを突き止めました。エンティティ フレームワークだと思っていたのですが、ファイアウォール コードであることがわかりました。次のコードは、.net 4.6.2 では問題なく動作し、.net コアでもほとんど問題なく動作します。ただし、メモリ リークがあります (具体的には 2firewallRule行目)。

アプリは、できるだけ多くのメモリを使い果たすため、毎日アプリを再起動する必要があります。約 35MB で実行する必要があるときに、12GB の高さを見てきました。それも、その高値になるのに1日かそこらしかかかりません。したがって、基本的に への各呼び出しfirewallRuleは 5MB ~ 10MB を消費します。1 つのレコードまたは null レコードがそれだけの量のメモリを消費するのはおかしいと思われます。

firewallRule呼び出されているメソッド(およびそのアプリ)の他のすべての行を文字通りコメントアウトしたため、その行だと思います。最終的にその行をコメントアウトすると、リークが停止します。私の論理に欠陥がある場合はお知らせください。

テストしたい場合は、NetFwTypeLibそのコードを機能させるために参照を作成する必要があります。

なぜこれが起こっているのか、それを修正する方法を知っている人はいますか?

アップデート:

すべてをコメントアウトしていないと思われる方のために、元のコードを次に示します。

本番環境では、このメソッドを「そのまま」実行するだけで、メモリを消費します。繰り返しますが、.Net 4.6.1 (コメントなし) でこの同じコードを 1 年以上問題なく実行したため、これは .Net Core に固有のものです。

考えてコメントアウトしたので、ループに入れ、ここで内部的にトラブルシューティングすることもできます。レースだ…

現在実行されているサーバーは Windows Server 2016 です。

更新 2: Windows 10 でも再現可能です。エラーを再現するためのコード全体を次に示します。

結果は次のとおりです。

Visual Studio 診断ツール:

Visual Studio 診断ツール

マイクロソフトのバグのようですか?これらのメモリ プロファイラーの 1 つに取り組んでみようと思いますが、問題が見つかった場合でも、どうすればよいでしょうか? これは、基本的な Windows ライブラリへの基本的な呼び出しであり、コメントの一部の人々が要点を見逃していると思います。

アプリのプロファイリングを記憶したり、問題を追跡したりすることを誰かに求めているわけではありません (決してそうではありませんでした... 私はすでにそれを行っています)。別の解決策を求めています。私が完全に使用できる構造またはlinqの問題またはその他のステートメントはありますか?

質問を閉じたままにしておきたい場合は、それで構いませんが、他の誰もこれに遭遇しないとは信じがたいです.

0 投票する
0 に答える
120 参照

winapi - Windows ファイアウォール: ユーザー操作 API を探しています

Windows ファイアウォールと対話する Windows 10 用の小さな GUI アプリケーションを作成することを検討しています。

ただし、目的のアクションに関連する API を見つけるのに苦労しています。

ユースケース(状況)

Windows 10 がかなり工場出荷時のデフォルトの家庭で使用されている場合 (写真: おばあちゃんが電子メールを読んで Web を閲覧している)、ファイアウォールは次のように構成するのが一般的です。

  1. 幅広い Windows サービスとアプリケーション (Web ブラウザ、電子メール クライアントなど) のさまざまな形式のネットワーク アクセスを許可する多くのルールが存在します。
  2. おそらく、特定のアプリケーションがインターネットにまったくアクセスできないようにブロックする (または特定の制約を受ける) いくつかのルールがあります。
  3. 有効になっている可能性のあるいくつかのプロファイル/ポリシーの 1 つです。これは、以前は不明だったアプリケーションがネットワークまたはインターネットを使用しようとしたときに何をすべきかを決定します。

私の質問は、ポイント 3 を中心に展開しています。

私の目的

通常、Windows ファイアウォールのアクティブなプロファイルは、デフォルトでそのような「新しい」アプリケーションの接続を拒否するように設定されていますが、許可するかどうかをユーザーに尋ねるポップアップも表示されます。この機能はほとんどそのままにしておきたいのですが、組み込みのポップアップが表示される代わりに、ウィンドウがカスタム アプリケーションに通知し、適切なアクション (ユーザー操作の有無にかかわらず) を決定できるようにしたいと考えています。

スクリーンショット:

Windows ファイアウォール API

これまでにわかったことについては、「Windows Defender ファイアウォール」または単に「Windows ファイアウォール」(netfw.h) には、関連する多くの API/機能があります。それらは(ほとんど)https://docs.microsoft.com/en-us/windows/win32/api/netfw/で十分に文書化されています

INetFwRule (|2|3) API は、個々のファイアウォール ルールを処理します。

INetFwProfileおよびINetFwPolicy(|2) API は、次のような関心のあるものに関連する設定を処理します。

INetFwPolicy2::get_NotificationsDisabled

INetFwProfile::get_NotificationsDisabled

しかし、通知をオンまたはオフにするためのゲッター/セッターメソッドだけが、そのいずれかにフックする関数の登録に関連するものを見つけることができません。

これまでに見つかった最も有望な API はINetFwProduct(s) のようです。含む

INetFwProducts::Register -> アプリケーションまたはサービスが、サード パーティのファイアウォール製品を Windows ファイアウォールに登録するためのメソッドとプロパティにアクセスできるようにします。

INetFwProduct::get_RuleCategories -> サード パーティのファイアウォール製品の登録の場合、サード パーティのファイアウォールが Windows ファイアウォールから所有権を取得するルール カテゴリを示します。

これは明らかに、NETFW のワークロードの特定の側面を引き継ぐことができるように、サードパーティ プログラム (Zone Alarm、Norton Security などをイメージ) を登録することに関連しています。それが実際に私のアプリケーションが該当する指定、つまりセキュリティ ツールの指定である可能性は低くありません。

INetFwProductのものは、いくつかの迷惑な制約 (Authenticode 署名など) をミックスにもたらしますが、これは特に関連性や重要性はありません (ただし、後で詳しく説明します)。

私の質問

ただし、主な問題は、これでも、(架空のINetFwProductに登録された) ソフトウェアが私が望むことをどのように達成するかについて、実際には何も考えられないことです。

INetFwProductパッケージを NETFW または少なくともいくつかのネットワーク層 API などに接続するメソッドを提供する別の API がどこかにあることを期待しています。

私がいるトレイルがどこにつながるか知っている人はいますか? または、同じことを達成するためのより簡単な方法に精通しているかもしれません。

INETFWPRODUCT はやり過ぎのようです

私はまた、このINetFwProductルート全体が、NETFW のワークロードのごく一部に置き換え/フックインすることだけを本当にしたいのに、私のプログラムが多大な責任を負っているのではないかと疑い始めています。結局のところ、ルールセット/ポリシーのバックエンド全体を置き換えたり、ルールの解釈方法を変更したり、その他の凝ったものを変更したりするつもりはありません。ユーザーがポップアップ GUI で盗聴される代わりに (またはその前に)、ユーザーランド プログラムが呼び出されるようにしたいだけです。理想的には、私のプログラムが行うことは、接続を許可するかどうかについてブール値を返すことだけです (必要に応じて、INetFwRule API を使用して、同じプログラムからの将来の接続に対して永続的なルールを追加することもできます)。

認証コードの要件

私の質問とは直接関係ありませんが、INetFwProduct機能は一連の新しい制約を画像にもたらします。私のアプリケーションは (一見) Authenticode 署名が必要で、IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY ヘッダーが必要です。私はこれらのことのどちらにもあまり詳しくありませんが、無料の Lets Encrypt 証明書はこれには使用できないことを理解しました (そして確認したようです)。同じことが自己署名証明書にも当てはまる可能性があります。そして、私はこれを非常に大きな (洗練された、有料の) 製品にするつもりはなく、特に FOSS プロジェクトとしてリリースするつもりもありませんでした。認定のために少なくとも年間 150 ユーロまたは 350 ユーロを費やします。