メインコンテンツへ飛ぶ

GN を使って Electron を構築する

· 読むのにかかる時間 1 分

Electron は、GN を使用して自身を構築しています。 その理由についてこちらで説明します。


GYP と GN

2013 年、最初に Electron がリリースされたとき、Chromium のビルド構成は GYP で記述されていました。これは "Generate Your Projects" の略です。

2014 年、Chromium プロジェクトは GN ("Generate Ninja") を導入しました。Chromium のビルドファイルは GN に移行され、GYP はソースコードから削除されました。

歴史的に、Electron はメインの Electron コードlibchromiumcontent を分離しています。これは、Chromium の 'content' サブモジュールをラップする Electron の一部です。 Electron は GYP を使用し続けましたが、Chromium の方の libchromiumcontent は GN に切り替えました。

ピッタリ噛まない歯車のように、2 つのビルドシステムの間に摩擦がありました。 互換性の維持にはエラーが発生しやすくなりました。コンパイラフラグと #define を Chromium、Node、V8、Electron 間で細心の注意を払って同期する必要があるからです。

これに対処するため、Electron チームは全てを GN へ移行してきました。 そしてついに、Electron 最後の GYP コード削除の コミットが master に乗りました。

開発者にとっての意義

Electron 自体にコントリビュートしている方は、master もしくは 4.0.0 から Electron をチェックアウトしてビルドするプロセスが 3.0.0 以前と大きく変わります。 詳細は GN ビルド手順 を参照してください。

Electron でアプリを開発している方は、新しい Electron 4.0.0-nightly でのいくつかの小さな変更に気付くかもしれません。しかし、Electron ビルドシステムが変わったことによる影響はおそらくありません。

Electron にとっての意義

GN は GYP より 高速 で、ファイルの可読性が高く保守も容易です。 さらに、単体のビルド構成システムを使用することで、Electron を Chromium の新バージョンへアップグレードするにあたって必要な作業が軽減されるでしょう。

  • Chromium 67 では MSVC サポートを削除し、Windows でも Clang を使用したビルドに切り替えました。そのため、Electron 4.0.0 での開発は既に大幅に支援されています。 GN ビルドでは、Chromium からすべてのコンパイラコマンドを直接継承するため、Windows 用 Clang ビルドを無料で入手できます!

  • また、Electron、Chromium、Node 間で同じビルドの BoringSSL を Electron に使用しやすくなりました。これはもはや 過去の問題 です。

WebPreferences 脆弱性の修正

· 読むのにかかる時間 1 分

Electron バージョン (3.0.0-beta.6、2.0.7、1.8.7、1.7.15) において、ネストされた子ウィンドウを開くことのできるアプリに影響するリモートコード実行の脆弱性が発見されました。 この脆弱性には CVE 識別子 CVE-2018-15685 が割り当てられています。


影響を受けるプラットフォーム

以下の条件に該当する場合、影響を受けます。

  1. サンドボックス内を含め、なんらかの 外部ユーザコンテンツを埋め込んでいる
  2. XSS 脆弱性のあるユーザの入力受け付けがある

詳細

いずれかのユーザコードが iframe 内で動作している、または iframe を作成できる場合に影響を受けます。 XSS の脆弱性が発生する可能性を考えると、ほとんどのアプリがこのケースに対して脆弱であると想定できます。

ウインドウを nativeWindowOpen: truesandbox: true で開いている場合でも影響を受けます。 この脆弱性はアプリ内に XSS 脆弱性が存在することも条件にありますが、先述のオプションを使用している場合、以下の緩和策のどれかを適用する必要があります。

緩和策

私たちはこの脆弱性の修正を含む新しいバージョンの Electron を公開しました。3.0.0-beta.72.0.81.8.81.7.16 です。 Electron 開発者全員は、アプリをすぐに最新の安定バージョンに更新することを推奨します。

何らかの理由で Electron のバージョンをアップグレードできない場合は、すべての webContents に対して new-window イベントで event.preventDefault() を呼ぶことであなたのアプリを保護できます。 window.open や子ウィンドウを用いないこともまた有効な緩和策です。

mainWindow.webContents.on('new-window', (e) => e.preventDefault());

子ウインドウが孫ウインドウを作ることに依存している場合、3 つ目の緩和策として、最上位ウインドウに以下のコードを使用すると良いでしょう。

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences(),
);
if (options.webContents) {
handle(options.webContents);
}
},
);
};
handle(topWebContents);
};

enforceInheritance(mainWindow.webContents);

このコードは、最上位ウインドウの webPreferences がすべての子ウィンドウへ無限に適用されるように手動で強制します。

詳細情報

この脆弱性は Contrast SecurityMatt Austin により発見され、責任を持って Electron プロジェクトへ報告されました。

Electron アプリを堅牢に保つベストプラクティスの詳細は、セキュリティチュートリアル を参照してください。

Electron の脆弱性を報告する場合は、security@electronjs.org にメールでご連絡お願いします。

検索

· 読むのにかかる時間 1 分

Electron のウェブサイトに、APIドキュメント、チュートリアル、Electron 関連の npm パッケージなどを瞬時に検索できる新しい検索エンジンを導入しました。

Electron 検索のスクリーンショット


Electron のような新しい技術やフレームワークを覚えるのは大変なことです。 クイックスタート の段階を過ぎると、ベストプラクティスを学んだり、適切な API を見つけたり、夢のアプリを構築するのに役立つツールを発見したりするのが難しくなっていきます。 Electron のウェブサイトを、より早く、より簡単なアプリ構築のために必要なリソースを探せるようなより良いツールにしたいと考えています。

electronjs.org の任意のページにアクセスすると、ページ上部に新しい検索欄が表示されます。

検索エンジン

ウェブサイトに検索を追加しようと思った当初は、バックエンドに GraphQL を使った独自の検索エンジンを試運転しました。 GraphQL の作業は楽しく、検索エンジンは高パフォーマンスでしたが、この構築は分かりきった作業ではないとすぐに気づきました。 複数語での検索やタイプミス検出のようなものは、正しく動くために多くの作業を必要とします。 車輪を再発明するのではなく、既存の検索ソリューションである Algolia を使用することにしました。

Algolia は、React、Vue、Bootstrap、Yarn、その他多数 の人気オープンソースプロジェクトの間で急速に選ばれる検索エンジンとなったホスト型検索サービスです。

ここでは、Algolia が Electron プロジェクトに適していた機能をいくつか紹介します。

APIドキュメント

時折、何を達成したいか 分かっていても、どのように それを行うかが正確に分からないことがあります。 Electron には 750 以上の API メソッド、イベント、プロパティがあります。 人間は簡単に全部覚えられませんが、コンピュータにとっては得意分野です。 Electron の JSON API ドキュメント を利用して、Algolia にあるすべてのデータをインデックス化し、探している APIを簡単に見つけられます。

ウインドウをサイズ変更してみたいのですか? [resize] で検索して、必要なメソッドに直接ジャンプしましょう。

チュートリアル

Electron では、API ドキュメントを補完するチュートリアルのコレクションが増え続けています。 これで、関連する API ドキュメントと一緒に、特定トピックのチュートリアルもより簡単に見つけられるようになりました。

セキュリティのベストプラクティスをお探しですか? [security] と検索しましょう。

npm パッケージ

npm レジストリには現在 70 万以上のパッケージがあり、必要なパッケージを見つけるのは簡単ではありません。 これらのモジュールをより簡単に探せるように、Electron 向けに特別に作られた 3400 以上のモジュールを集めた electron-npm-packages を作成しました。

Libraries.io の方々は、コード、コミュニティ、ドキュメント、使用状況などのメトリクスの組み合わせに基づいてソフトウェアプロジェクトをスコアリングするシステム、SourceRank を作成しています。 これらのスコアを使って、npm レジストリ内のすべてのモジュールのスコアを含む [sourceranks] モジュールを作成しパッケージの結果をソートしています。

Electron 内蔵の IPC モジュールの代替品をお探しですか? is:package ipc と検索しましょう。

Electron アプリ

Algolia でのデータのインデックスは簡単 なので、electron/apps から既存アプリのリストを追加しました。

[music] や [homebrew] と検索してみてください。

結果のフィルタリング

GitHub の コード検索 を使ったことがある人なら、extension:jsuser:defunkt のようなコロンで区切られたキーバリューフィルタが存在すると気づいているでしょう。 このフィルタリング技術は非常に強力なものであると考えており、Electron の検索に is: キーワードを追加しました。これにより、一種類の結果のみを表示するようにフィルタできます。

キーボードナビゲーション

キーボードショートカットはみんな大好き! キーボードから指を離さずに検索できるようになっています。

  • / 検索欄にフォーカス
  • esc 検索欄にフォーカスしてそれを消去
  • down 次の結果に移動
  • up 前の結果か検索欄に移動
  • enter 結果を開く

また、このキーボード操作を可能にする モジュール もオープンソース化しました。 Algolia InstantSearch 用に設計されていますが、他の検索実装と互換になるように一般化してあります。

フィードバック募集中

新しい検索ツールで何か問題が発生した場合は、それについてお聞かせください!

フィードバックを提出する最善の方法は、GitHub で適切なリポジトリに Issue を提出することです。

謝辞

これらの新しい検索機能を構築してくださった Emily JordanVanessa YuenLibraries.io のスコアを提供してくださった SourceRank 、そして私たちの活動を支援してくださった Algolia のチームに感謝します。 🍹

国際化アップデート

· 読むのにかかる時間 1 分

新しく国際化された Electron ウェブサイトの 立ち上げ 以来、英語圏以外の開発者が Electron の開発知識をさらに利用しやすいように取り組んでいます。

そこで、エキサイティングな国際化 (i18n) アップデートを紹介しましょう!


🌐 言語切替

翻訳ドキュメントの読者の多くは、原文の英語ドキュメントも相互参照することが多いというのはご存知ですか? 古かったり不正確だったりする訳文を避けるために、英語ドキュメントを習熟しているのです。これは国際化されたドキュメントに鳴らされる警笛の一つです。

Electron ドキュメントの言語切替

英語ドキュメントへの相互参照を容易にするため、Electron ドキュメントの文章を英語とウェブサイトの表示言語との間でシームレスに切り替えられる機能を追加しました。 ウェブサイトで英語以外のロケールを選択すれば、言語切替が表示されます。

⚡️ 訳文ページへのクイックアクセス

新しい Electron ドキュメントのフッターが日本語になっている

ドキュメントを読んでいて、誤植や誤訳に気がつきましたか? もう Crowdin にログインしたり、ロケールを選択したり、修正したいファイルを見つけたりする必要はありません。 代わりに、ドキュメントの一番下までスクロールし、上記の [このドキュメントを改善する] をクリックするだけです。 一丁あがり! Crowdin の翻訳ページに直接移動します。 さあ、あなたの翻訳魔法を見せてごらん!

📈 統計

Electron ドキュメント国際化 (i18n) の取り組みを公表して以来、世界中の Electron コミュニティメンバーからの翻訳の貢献が 爆発的に 増加してきています。 現在まで、1,719,029 の文字列が、1,066 人のコミュニティ翻訳者から 25 の言語で翻訳されています

Crowdin が提供する翻訳予報

このままの (執筆時点での過去 14 日間のプロジェクトアクティビティに基づく) ペースが保たれた場合、各言語への翻訳プロジェクトに必要なおおよその時間を示してくれる、楽しいグラフです。

📃 翻訳者アンケート

Electron の改善に時間を費やしてくださった皆さんに ❤️ありがとう❤️を! 翻訳者コミュニティのいかに勤勉かを正しく認識するため、翻訳者に関する情報 (すなわち Crowdin と Github のユーザー名の繋がり) を収集するアンケートを作成しました。

素晴らしい翻訳者の一員の方は、数分で済みますのでこちらからご記入ください。https://goo.gl/forms/b46sjdcHmlpV0GKT2

🙌 Node の国際化活動

Electron の国際化イニシアチブが成功したことから、Node.js は私たちのパターンに沿った 改訂版の国際化活動 をモデル化することにしました! 🎉 Node.js 国際化イニシアチブ が開始され、大きな勢いを得ています。草案とその背景事由は こちら で読むことができます。

🔦 コントリビューションガイド

Electron をより国際的で使いやすくする活動に興味がある方向けに、着手しやすいように手取り足取り解説している コントリビューションガイド があります。 国際化万歳! 📚

Electron 2.0.0

· 読むのにかかる時間 1 分

4 ヶ月以上の開発期間、8 回のベータリリース、数多くのアプリを段階的にロールアウトし、世界的なテストを経て、今日では electronjs.org にて Electron 2.0.0 のリリースが公開されます。


リリースプロセス

2.0.0 以降、Electron のリリースは セマンティックバージョニング に従います。 これによりメジャーバージョンが頻繁に上がるようになり、通常は Chromium に対応する形でメジャーアップデートとなります。 パッチリリースには優先度の高いバグ修正のみが含まれ、より安定したものになります。

Electron 2.0.0 は、メジャーリリース前の Electron での安定化方法の改善でもあります。 いくつかの大規模なElectronアプリでは、2.0.0 ベータ版が段階的にロールアウトされており、これまでのベータ版で最高のフィードバックループを提供しています。

変更 / 新機能

  • Chrome 61、Node 8.9.3、V8 6.1.534.41、Linux の GTK+ 3、スペルチェッカーの更新、Squirrel など、Electron のツールチェーンのいくつかの重要な部分に大きな変更が加えられました。
  • アプリ内課金 が MacOS に対応しました。 #11292
  • ファイル読み込み API が新しくなりました。 #11565
  • ウインドウの有効化/無効化 API が新しくなりました。 #11832
  • API app.setLocale() が新規作成されました。 #11469
  • IPC メッセージのロギングサポートが新しくなりました。 #11880
  • メニューイベントが新規追加されました。 #11754
  • powerMonitor に shutdown イベントを追加しました。 #11417
  • 複数の BrowserWindow を一つのプロセスにまとめる affinity オプションを追加しました。 #11501
  • saveDialog に利用可能な拡張子を表示する機能を追加しました。 #11873
  • 追加の通知アクションのサポートです #11647
  • macOS で通知を閉じるボタンのタイトルの設定機能。 #11654
  • menu.popup(window, callback) に条件を追加しました
  • タッチバーアイテムのメモリの改善。 #12527
  • セキュリティ推奨チェックリストを改善しました。
  • App-Scoped Security のスコープ有りブックマークを追加しました。 #11711
  • レンダラープロセスに任意の引数を設定する機能を追加しました。 #11850
  • フォーマットピッカー用アクセサリビューを追加しました。 #11873
  • ネットワークデリゲートの競合条件を修正しました。 #12053
  • Linux の mips64el アーキテクチャのサポートを削除しました。 Electron は C++14 のツールチェーンに依存しているのですが、リリース時にそのアーキテクチャでそのツールチェーンが利用できませんでした。 今後再サポートしたいと思っています。

API の破壊的変更

  • 以下の 非推奨 API を削除しました。
    • menu.popup シグネチャを変更しました。 #11968
    • 非推奨だった crashReporter.setExtraParameter を削除しました #11972
    • 非推奨だった webContents.setZoomLevelLimitswebFrame.setZoomLevelLimits を削除しました。 #11974
    • 非推奨だった clipboard メソッドを削除しました。 #11973
    • tray.setHighlightMode の真偽値引数のサポートを削除しました。 #11981

バグ修正

  • webContents.isOffscreen() が常に利用できるように変更しました。 #12531
  • デベロッパー ツールをドックしていない及びフォーカスしていない時の BrowserWindow.getFocusedWindow() を修正しました。 #12554
  • プリロードのパスに特殊文字が含まれている場合に、サンドボックス描画でプリロードがロードされない問題を修正しました。 #12643
  • ドキュメントの通りに allowRunningInsecureContent の既定値を訂正しました。 #12629
  • nativeImage の透明度を修正しました。 #12683
  • Menu.buildFromTemplate の問題を修正しました。 #12703
  • menu.popup の引数がオブジェクトか確認するようになりました。 #12330
  • 新規プロセス作成とコンテキスト解放との間の競合状態を取り除きました。 #12361
  • BrowserView 変更時にドラッグ可能領域を更新するようにしました。 #12370
  • フォーカス中にメニューバー切り替えの alt キーを検出するようにしました。 #12235
  • webview 内での誤警告を修正しました。 #12236
  • 親ウィンドウの 'show' オプションをそのまま引き継いでいたので修正しました。 #122444
  • getLastCrashReport() で本当に最後のクラッシュレポートかどうか確認するようにしました。 #12255
  • ネットワーク共有パスへの require を修正しました。 #12287
  • 右クリックメニューのクリックのコールバックを修正しました。 #12170
  • ポップアップメニュー位置を修正しました。 #12181
  • libuv ループのクリーンアップを改善しました。 #11465
  • 透過色おける hexColorDWORDToRGBA を修正しました。 #11557
  • getWebPreferences API でのヌルポインタ参照外しを修正しました。 #12245
  • メニューデリゲート内の循環参照を修正しました。 #11967
  • net.request のプロトコルフィルタリングを修正しました。 #11657
  • WebFrame.setVisualZoomLevelLimits はユーザーエージェントのスケール制約を設定するようになりました。#12510
  • webview のオプションの既定値を適切にしました。 #12292
  • 振動サポートを改善しました。 #12157 #12171 #11886
  • シングルトンフィクスチャのタイミングの問題を修正しました。
  • NotifierSupportsActions() の破損したプロダクションキャッシュを修正しました
  • MenuItem の role を camelCase 互換にしました。 #11532
  • タッチバーの状態更新を改善しました。 #11812#11761
  • 不要なメニューのセパレータを削除しました。 #11827
  • Bluetooth チューナーのバグを修正しました。 #11399 でクローズしています。
  • macOS フルスクリーン切り替えのメニューアイテムのラベルを修正しました。 #11633
  • ウィンドウが無効のときにツールチップが隠れる問題を改善しました。 #11644
  • 非推奨だった web-view のメソッドを移行しました。 #11798
  • BrowserView から開いたウインドウを閉じるときの問題を修正しました。 #11799
  • Bluetooth チューナーのバグを修正しました。 #11492
  • app.getFileIcon API でタスクスケジューラを使用するように更新しました。 #11595
  • オフスクリーンレンダリング時にも console-message イベントが発生するようにしました。 #11921
  • WebContents.downloadURL でのカスタムプロトコルからのダウンロードを修正しました。 #11804
  • デベロッパー ツールがデタッチされたときに透過ウィンドウが透明でなくなる問題を修正しました。 #11956
  • Electron アプリが再起動やシャットダウンを中止する問題を修正しました。 #11625

macOS

  • タッチバーアイテムを再利用した時のイベントリークを修正しました。 #12624
  • ダークモードでの tray のハイライトを修正しました。 #12398
  • 非同期の dialog がメインプロセスをブロックする問題を修正しました。 #12407
  • setTitle したときの tray のクラッシュを修正しました。 #12356
  • Dock メニュー設定時のクラッシュを修正しました。 #12087

Linux

  • Linux のデスクトップ通知を改善しました。 #12229 #12216 #11965 #11980
  • menu の GTK+ テーマサポートを改善しました。 #12331
  • Linux 上できれいに終了するようにしました。 #12139
  • tray アイコンのデフォルトツールチップにアプリ名を使うようにしました。 #12393

Windows

  • Visual Studio 2017 サポートを追加しました。 #11656
  • システムクラッシュハンドラへの例外渡しを修正しました。 #12259
  • 最小化したウィンドウでツールチップが非表示になる問題を修正しました。 #11644
  • desktopCapturer が正しい screen をキャプチャするように修正しました。 #11664
  • 透過状態における disableHardwareAcceleration を修正しました。 #11704

次回予告

Electron チームは、Chromium、Node、v8 の新バージョンのサポートに対して懸命に取り組んでいます。 3.0.0-beta.1 に乞うご期待!

オープンソースアプリの自動更新が簡単に

· 読むのにかかる時間 1 分

本日、無料でオープンソースのホスト型 更新ウェブサービス と連携 npm パッケージ をリリースし、オープンソース Electron アプリの自動更新を簡単にできるようにします。 これにより、アプリ開発者がデプロイについて頭を悩ませずに済み、ユーザーへの高品質なエクスペリエンス開発について集中できます。


新しい更新モジュールの動作

簡単に新しく

Electron には autoUpdater API があります。これはバックグラウンドで外部エンドポイントからメタデータを取得して、アプリのアップデートを確認し、自動的にインストールします。

こういった更新の有効化は、多くの Electron アプリ開発者にとってデプロイプロセスでの面倒な手順でした。アプリのバージョン履歴メタデータを提供するためだけに、ウェブサーバーを展開して維持する必要があるからです。

本日、アプリ自動更新の新しいドロップインソリューションを発表します。 Electron アプリが公開 GitHub リポジトリにあり、GitHub Releases を使用してビルドを公開している場合、このサービスでアプリの継続的なアップデートをユーザーに頒布できます。

新モジュールの使い方

最小限の構成にするため、新しい update.electronjs.org ウェブサービスと統合する npm モジュール update-electron-app を作成しました。

モジュールのインストール

npm install update-electron-app

アプリの メインプロセス 内のどこかで、以下を呼び出します。

require('update-electron-app')();

これだけです! このモジュールはアプリの起動時に更新を確認し、その後 10 分ごとにも確認します。 更新があれば、バックグラウンドで自動的にダウンロードされ、更新準備が整うとダイアログが表示されます。

既存アプリの移行

既に Electron の autoUpdater API を使用しているアプリもこのサービスを使用できます。 移行するには、update-electron-app モジュールをカスタマイズするか、update.electronjs.org と直接統合 します。

代替手段

electron-builder でアプリをパッケージ化している場合、その組み込みアップデーターを使用できます。 詳細は、electron.build/auto-update を参照してください。

アプリが非公開の場合、独自の更新サーバーを実行する必要があります。 これには、Zeit の Hazel や Atlassian の Nucleus など、多くのオープンソースツールがあります。 さらなる情報は 更新サーバーのデプロイ のチュートリアルをご参照ください。

謝辞

このシンプルでスケーラブルなウェブサービスの設計と構築を支援して頂いた Julian Gruber に感謝します。 オープンソースの Hazel サービスを作った Zeit の方々に感謝します。このサービスからデザインのインスピレーションを得ました。 コードレビューをして下さった Samuel Attard に感謝します。 このサービスのテストを支援していただいた Electron コミュニティに感謝します。

🌲 Electron アプリの未来はここに永遠の緑となった!

Electron 2 の新機能: アプリ内課金

· 読むのにかかる時間 1 分

新しい Electron 2.0 リリースラインは新しい機能と修正が 詰め込まれて います。 この新しいメジャーバージョンのハイライトの1つは、Apple の Mac App Store 向けの inAppPurchase API です。


アプリ内購入により、コンテンツやサブスクリプションをアプリ内から直接購入できます。 これにより、開発者は 基本無料ビジネスモデル を簡単に取り入れることができます。これは、プレミアム機能、追加コンテンツ、サブスクリプションのための任意のアプリ内購入が提供されるものです。

新しい API は、コミュニティのコントリビューター Adrien Fery によって Electron に追加され、講義や会議用のメモをとる Electron アプリ Amanote でアプリ内購入ができるようになりました。 Amanote は無料でダウンロードでき、数式、図面、音声録音などの機能を備え、明確で構造化されたメモを PDF に追加できます。

Mac 版 Amanote にアプリ内購入サポートを追加して以来、Adrien は 売り上げが 40% 増加 しました!

始めましょう

新しい inAppPurchase API には、すでに最新の Electron ベータ版に入っています。

npm i -D electron@beta

API のドキュメントは GitHub にあります。Adrien の API の使用方法に関するチュートリアルも十二分に親切です。 アプリへアプリ内課金を追加していくには [チュートリアルを参照してください](https://github.com/AdrienFery/electron/blob/a69bbe882aed1a5aee2b7910afe09900275b2bf6/docs/tutorial/in-app- purchases.md)。

APIの改善 は現在進行中です。間もなくリリースされる Electron ベータリリースで公開されます。

次は Windows かも

次に、Adrien は Electron に Microsoft Store のアプリ内購入サポートを追加することで、Amanote の新しい収益口を開こうと考えています。 今後の開発にご期待ください!

Webview の脆弱性の修正

· 読むのにかかる時間 1 分

Node.js インテグレーションを無効している Electron アプリケーションで、再度有効にできる脆弱性が発見されました。 この脆弱性には CVE 識別子 CVE-2018-1000136 が割り当てられています。


影響するアプリケーション

以下の すべて に当てはまる場合、そのアプリケーションは影響します。

  1. Electron 1.7, 1.8, か 2.0.0-beta で実行している
  2. 任意のリモートコードの実行を許可している
  3. Node.js インテグレーションを無効にしている
  4. webPreferences で webviewTag: false を明示的に宣言していない
  5. nativeWindowOption オプションを有効にしていない
  6. new-window イベントをインターセプトしておらず、提供された options タグを使用せずに event.newGuest を手動でオーバーライドしている

これはごく少数の Electron アプリケーションになりますが、予防としてすべてのアプリケーションはアップグレードすることを推奨します。

緩和策

この脆弱性は本日の 1.7.131.8.42.0.0-beta.5 のリリースで修正されました。

アプリケーションの Electron のバージョンをアップグレードできない開発者は、以下のコードで脆弱性を軽減できます。

app.on('web-contents-created', (event, win) => {
win.on(
'new-window',
(event, newURL, frameName, disposition, options, additionalFeatures) => {
if (!options.webPreferences) options.webPreferences = {};
options.webPreferences.nodeIntegration = false;
options.webPreferences.nodeIntegrationInWorker = false;
options.webPreferences.webviewTag = false;
delete options.webPreferences.preload;
},
);
});

// and *IF* you don't use WebViews at all,
// you might also want
app.on('web-contents-created', (event, win) => {
win.on('will-attach-webview', (event, webPreferences, params) => {
event.preventDefault();
});
});

詳細情報

この脆弱性は Trustwave SpiderLabs の Brendan Scarvell によって発見され、Electron プロジェクトに責任ある形で報告されました。

Electron アプリを堅牢に保つベストプラクティスの詳細は、セキュリティチュートリアル を参照してください。

Electron の脆弱性を報告する場合は、security@electronjs.org にメールでご連絡お願いします。

メールリスト に参加すると、リリースとセキュリティアップデートに関する更新情報を受信できます。

Web サイトのしゃっくり

· 読むのにかかる時間 1 分

先週、 electronjs.org で数分間のダウンタイムが発生しました。 この短い停止による影響でご迷惑をおかけして申し訳ありません。 本日、少しの調査の後、根本の原因を診断し、 修正 を行いました。


今後このようなダウンタイムを防ぐために、 Heroku threshold alerts をアプリで有効化しました。 失敗したリクエストや遅いレスポンスが一定のしきい値を超えて蓄積されるたびに、私たちのチームに通知され、素早く問題に対応できます。

すべての言語のオフラインドキュメント

あなたが Electron アプリを飛行機や地下のコーヒーショップで開発するとき、オフラインで参照するためにドキュメントのコピーが欲しい場合があるでしょう。 幸いにも、Markdown ファイルによる Electron ドキュメントは 20 以上の言語で利用できます。

git clone https://github.com/electron/electron-i18n
ls electron-i18n/content

GUI でのオフラインドキュメント

devdocs.io/electron は、 Electron だけでなく、 JavaScript 、 TypeScript 、 Node.js 、 React 、 Angular などのドキュメントを保存している便利な Web サイトです。 もちろん、参考となる Electron アプリもあります。 Electron サイトの devdocs-app をご参照ください。

devdocs-app

アプリをマウスやトラックパッドを使わずにインストールしたい方は、Electron Forge にある以下の install コマンドをお試しください。

npx electron-forge install egoist/devdocs-app

プロトコルハンドラの脆弱性の修正

· 読むのにかかる時間 1 分

遠隔コード実行の脆弱性が発見されました。これはカスタムプロトコルハンドラを使用している Electron アプリに影響します。 この脆弱性には CVE 識別子 CVE-2018-1000006 が割り当てられています。


影響を受けるプラットフォーム

Windows 向けに設計された Electron アプリが影響を受けます。myapp:// のようなプロトコルのデフォルトハンドラに自身を登録することで起きる脆弱性です。

ネイティブコード、Windows レジストリ、Electron の app.setAsDefaultProtocolClient API を使用しているようなアプリは、プロトコルの登録方法に関係なく影響を受ける可能性があります。

macOS と Linux には、この問題での 脆弱性はありません

緩和策

この脆弱性に対する修正を含む新しいバージョンの Electron を公開しました。 1.8.2-beta.51.7.121.6.17 です。 Electron 開発者全員は、アプリをすぐに最新の安定バージョンに更新することを推奨します。

何らかの理由で Electron バージョンをアップグレードできない場合は、app.setAsDefaultProtocolClient を呼び出すときに、最後の引数として -- を追加します。これにより、Chromium がそれ以降の引数を解析しなくなります。 ダブルダッシュ - はコマンドオプションの終わりを示し、その後は位置引数のみを受け入れます。

app.setAsDefaultProtocolClient(protocol, process.execPath, [
'--your-switches-here',
'--',
]);

詳細については、app.setAsDefaultProtocolClient を参照してください。

Electron アプリを堅牢に保つベストプラクティスの詳細は、セキュリティチュートリアル を参照してください。

Electron の脆弱性を報告する場合は、security@electronjs.org にメールでご連絡お願いします。