サンダヌバヌド、RNP、および優れたAPIの重芁性





最近、 API蚭蚈に぀いおThunderbird開発者ずチャットしたした  。この䌚話の間に、私は䞊の私の考えで共有 RNP、  OpenPGPのの新しい実装Thunderbirdは最近の代わりに䜿甚し始めおいるこず はGnuPGを。



察話者は、RNP APIを改善する必芁があるずいう私の論文に懐疑的で、「䞻芳的ではありたせんか。どちらのAPIが優れおいお、どちらが悪いのですか」ず尋ねたした。 APIを評䟡するための適切な指暙がないこずに同意したす。しかし、原則ずしおAPIを刀断できないこずに同意したせん。



実際、経隓豊富なプログラマヌのほずんどは、APIを芋るず、悪いAPIを認識するず思いたす。この蚘事でさらに、優れたヒュヌリスティックを開発するこずが刀明するず思いたす。これは、GnuPG、Sequoiaでのおよびそれ以䞊の自分の経隓に基づいお構築しようずしたす。  およびRNP。次に、RNPAPIに぀いお説明したす。残念ながら、このAPIは簡単に誀甚される可胜性があるだけでなく、欺瞞的であるため、セキュリティが重芁なコンテキストではただ䜿甚しないでください。しかし、サンダヌバヌドのタヌゲットオヌディ゚ンスは、ゞャヌナリスト、掻動家、匁護士、およびそのコミュニケヌションパヌトナヌなど、脆匱であるこずが知られおいる人々です。これらすべおの人々は保護を必芁ずしおいたす。私の意芋では、これはThunderbirdがRNPを䜿甚するかどうかに぀いおもう䞀床考えるべきであるこずを意味したす。



泚このメヌルも読むこずをお勧めしたす  ThunderbirdでGPLラむブラリを䜿甚したしょう これを ThunderbirdDevelopmentPlanningの 投皿に送信 ã—たした。



悪いAPIの特城は䜕ですか



JustusずKaiでSequoiaを開始する前は  、3人でGnuPGに取り組んでいたした 。私たちは自分たちでgpgを掘り䞋げただけでなく、その埌の倚くのgpgナヌザヌず話し合ったり協力したりしたした。人々はGnuPGに぀いお倚くの良いこずを蚀うこずができたした  。





gpgに察する批刀に関する限り、最も重芁なのはAPIに関する2皮類の批刀でした。最初の芁玄はこれですgpgAPIはあたりにも独断的です。たずえば、gpgはキヌリングアプロヌチを䜿甚したす。したがっお、OpenPGP蚌明曞は、個人キヌベヌスにむンポヌトされおいる堎合にのみ衚瀺たたは䜿甚できたす。ただし、䞀郚の開発者は、最初に蚌明曞を確認しおから、それをむンポヌトしたいず考えおいたす。たずえば、キヌサヌバヌでフィンガヌプリントを䜿甚しお蚌明曞を怜玢する堎合 、返された蚌明曞が本圓に必芁なものであるかどうかを確認できたす。そのURLは自己認蚌であるためです。これはgpgを䜿甚しお実行できたすが、回避策ずしおのみ、それに埋め蟌たれおいるプログラミングモデルの原則をバむパスしたす。基本的な考え方は次のずおりです。䞀時ディレクトリを䜜成し、それに構成ファむルを远加し、gpgに代替ディレクトリを䜿甚するように指瀺し、そこに蚌明曞をむンポヌトし、蚌明曞を確認しおから、䞀時ディレクトリをクリアしたす。これは、 åŸŒç¶šã®gpgナヌザヌずの䌚話に基づいおJustusによっお远加され  た 公匏の掚奚事項です。はい、この方法は機胜したす。ただし、オペレヌティングシステムに固有のコヌドを䜜成する必芁がありたす。このコヌドは遅く、バグが頻繁に発生したす。



私たちが䜕床も遭遇した別のクラスの意芋は、gpgを䜿甚するには、このメカニズムを乱甚しないように、倚くの非自明なこずを知る必芁があるずいうこずです。たたは、別の蚀い方をすれば、gpg APIを䜿甚するずきは、コヌドに䞍泚意で脆匱性が導入されないように十分に泚意する必芁があり たす。



2番目の懞念事項をよりよく理解するために、EFAILの脆匱性を怜蚎しお ください..。 gpg埩号化APIの䞻な問題メッセヌゞを埩号化するずき、入力が砎損しおいる堎合でも、gpgはプレヌンテキストを出力したす。この堎合、gpgぱラヌを返したすが、䞀郚のプログラムは䟝然ずしお砎損した圢匏でプレヌンテキストを出力したす。では、なぜですか䜕も衚瀺しないよりも、メッセヌゞの少なくずも䞀郚を衚瀺する方が間違いなく良いでしょう。 EFAILの脆匱性は、攻撃者がこれを利甚 ã—お暗号化されたメッセヌゞにWebバグを挿入する方法を瀺しおい たす。ナヌザヌがこの投皿を衚瀺するず、Webバグが投皿から挏れたす。ふぅ。



では、このバグは誰のせいですかGnuPG  開発者  は それを䞻匵したした å•é¡Œã¯ã€gpgを誀っお䜿甚するずいう点で、アプリケヌションレベルにありたす。



メヌルナヌザヌ゚ヌゞェントは、ステヌタスコヌドDECRYPTION_FAILEDを尊重し、デヌタを衚瀺しないか、少なくずも、オラクルを䜜成せずに砎損しおいる可胜性のあるメヌルを衚瀺する適切な方法を遞択するこずをお勧めしたす。メヌルが自信を刺激しないこずをナヌザヌに通知したす。



gpgぱラヌを通知したした。アプリケヌションはAPIコントラクトを尊重したせん。私はGnuPG開発者に同意し、远加する必芁がありたす。gpgむンタヌフェヌスは、ナヌザヌに続行方法を指瀺しないため、時限爆匟でしたそしお今でもそうです。それどころか、簡単で䞀芋有益な行動は間違っおいたす。そしお  この  皮のAPI残念ながら、GnuPGでは䞀般的です。



良いAPIを䜜るものは䜕ですか



gpg APIが独断的すぎお適切に䜿甚するのが難しいずいう、これら2぀のこずを認識しお、私の蚈画を圢䜜りたした。セコむアプロゞェクトを始めたずき、私たちはそのような間違いを避けたいず同意したした。私たちの芳察に基づいお、SequoiaAPIの開発の参照ポむントずしお匕き続き䜿甚する2぀のテストを実行したした。たず、高レベルのAPIに  加えお、独断的ではない䜎レベルのAPIが必芁です。これは、ナヌザヌが犁止されおいないこずを実行するこずを劚げないずいう意味です。同時に、  APIはナヌザヌを適切なハヌドコヌドされたものに導き、適切なアクションを実行しやすくし、アクションを遞択するずきに最も明癜にする必芁がありたす。



すべおを可胜にするが゚ラヌを防ぐずいう、これら2぀のわずかに矛盟する目暙を達成するために、タむプず䟋の2぀のツヌルに特に倧きく䟝存しおきたした。APIコントラクトはコンパむル時に圢匏化され、特定の倉換を匷制するため、型を䜿甚するず、意図しない方法でオブゞェクトを䜿甚するこずが困難になりたす 。䟋コヌドスニペットが  コピヌされたす。したがっお、良い䟋は、関数を正しく䜿甚する方法をナヌザヌに教えるだけでなく、ナヌザヌが関数を䜿甚する方法にも倧きく圱響したす。



タむプ



セコむアで型を䜿甚する方法ず、それらが優れたAPIの䜜成にどのように圹立぀かを䟋で瀺したす。䟋をより明確にするために、OpenPGPに関するいく぀かのコンテキストを思い出すず䟿利です。





OpenPGP



OpenPGPには、蚌明曞、コンポヌネントキヌやナヌザヌIDなど、バむンディング眲名など、いく぀かの基本的なデヌタ型がありたす。蚌明曞のルヌトは、蚌明曞のフィンガヌプリントを完党に識別するプラむマリキヌですフィンガヌプリント=ハッシュプラむマリキヌ。蚌明曞には通垞、サブキヌやナヌザヌIDなどのコンポヌネントが含たれおいたす。 OpenPGPは、いわゆるバむンディング眲名を䜿甚しおコンポヌネントを蚌明曞にバむンドしたす。通垞の䞻キヌハッシュをフィンガヌプリントずしお䜿甚し、眲名を䜿甚しおコンポヌネントを䞻キヌにバむンドするず、埌で远加のコンポヌネントを远加できるように条件が䜜成されたす。バむンディング眲名にはプロパティも含たれたす。したがっお、たずえば、サブキヌの有効期間を延長するために、コンポヌネントを倉曎するこずができたす。結果ずしお、耇数の有効な眲名を特定のコンポヌネントに関連付けるこずができたす。アンカヌ眲名は基本的なだけでなく、OpenPGPセキュリティメカニズムに䞍可欠です。



有効なバむンディング眲名は倚数存圚する可胜性があるため、必芁なものを遞択する方法が必芁です。最初の抂算ずしお、必芁な眲名が、将来延期されおいない、最新の、有効期限が切れおいない、取り消されおいない有効な眲名であるず想定したす。しかし、有効な眲名ずは䜕ですかセコむアでは、眲名は数孊的チェックに合栌するだけでなく、ポリシヌず䞀臎しおいる必芁がありたす。䟋えば、による圓瀟の胜力にする 劥協の衝突に耐え、我々は唯䞀  の状況は非垞に少数のSHA-1が可胜。  PGPainlessに取り組んでいるPaul Schaubは  、最近、  これらの耇雑さに぀いお詳しく曞いおいたす。。APIナヌザヌにこれらすべおの考慮事項を念頭に眮くように匷制するこずにより、脆匱性の枩床を䜜成したす。セコむアでは、有効期限を取埗する簡単な方法が安党な方法です。期埅どおりに機胜する次のコヌドに぀いお考えおみたす。



let p = &StandardPolicy::new();
 
let cert = Cert::from_str(CERT)?;
for k in cert.with_policy(p, None)?.keys().subkeys() {
    println!("Key {}: expiry: {}",
             k.fingerprint(),
             if let Some(t) = k.key_expiration_time() {
                 DateTime::<Utc>::from(t).to_rfc3339()
             } else {
                 "never".into()
             });
}
      
      







cert



 èšŒæ˜Žæ›žã§ã™ã€‚ポリシヌを適甚するこずから始めたす。 ポリシヌはナヌザヌ定矩ですが、原則ずしお、  StandardPolicy ã§ååˆ†ã§ã‚るだけでなく、最も適切です。実際、これは蚌明曞のビュヌが䜜成される堎所であり、有効なバむンディング眲名を持぀コンポヌネントのみが衚瀺されたす。重芁なのは、それはたた、倚くの新しいメ゜ッドを倉曎しお導入するこずです。たずえば、keysメ゜ッドは、KeyAmalgamation  ではなくValidKeyAmalgamationを返すように倉曎され  たした。 結果にはキヌだけでなく、それに関連するすべおの眲名が含たれるため、これはマヌゞです。このプロセスは塊魂ず呌ばれる方がよいず 考える人もいたす。..。 ¯\ _ツ_ /¯ValidKeyAmalgamationには、䞊蚘の基準に埓っお有効なアンカヌ眲名がありたす。たた、key_expiration_timeのようなメ゜ッドも提䟛したす。これは、有効なキヌでのみ意味がありたす。たた、key_expiration_timeで䜿甚される戻りタむプは人間工孊的であるこずに泚意しおください。 key_expiration_timeは、生の倀を返す代わりに、安党で䜿いやすいSystemTimeを返したす 。



最初の「すべお蚱可」の原則に沿っお、開発者は匕き続き単䞀の眲名ぞのアクセスを保持 し、サブパッケヌゞ ã‚’  調査したすキヌの有効期限が切れたずきに、別の眲名バむンディングから怜玢したす。ただし、Sequoia APIがキヌの有効期限を正しく認識しおいるず想定される方法ず比范するず、他のアプロヌチはAPIず矛盟したす。これは私たちの意芋では良いAPIです。



の䟋



 Sequoiaラむブラリの1.0リリヌスは、2020幎12月に行われたした。その9か月前に、フィヌチャヌコンプリヌトの状況に入り、リリヌスの準備が敎いたした。しかし、圌らは埅っお いたした。ドキュメントず䟋をパブリックAPIに远加するのに次の9か月かかりたした。 äŸ‹ã«ã€ã„おは、Certデヌタ構造のドキュメントを  参照しおください。䜕が埗られるかを確認しおください。私たちの投皿で指摘されおいるように、すべおの機胜の䟋を1぀たで提䟛するこずはできたせんでしたが、かなりのこずを行いたした。䟋を曞くこずぞのボヌナスずしお、私たちはたた、いく぀かの粗い゚ッゞを芋぀けるこずができたした。そしお、それは私たちがその過皋で磚きたした。



リリヌス埌、コヌドにSequoiaを含めた倚くの開発者ず話をするこずができたした。圌らのフィヌドバックに共通するスレッドは、ドキュメントず䟋の䞡方がどれほど有甚であるかを認識するこずでした。これは私たちのコヌドですが、ほが毎日ドキュメントを調べお、独自の䟋をコピヌしおいるこずを確認できたす。簡単です。䟋は特定の機胜を正しく䜿甚する方法を瀺しおいるので、なぜ最初からやり盎すのですか



RNP API



RNP ã¯ã€äž»ã«Riboseによっお開発されたOpenPGPの新しい実装です 。玄  2幎前、ThunderbirdはEnigmail ã‚’Thunderbirdに統合するず同時に、GnuPGをRNPに眮き換えるこずを決定し  たした  。サンダヌバヌドがRNPを遞んだずいう事実は、RNPを喜ばせるだけではありたせん。それはたた、RNPがメヌルを暗号化するためのOpenPGPの最も芁求された実装になったこずを意味したす。



批刀は吊定的なものずしお認識されやすいです。はっきりさせおおきたいのですが、リボヌスが行っおいる䜜業は良くお重芁だず思いたす。OpenPGPの新しい実装に時間ず劎力を費やしおくれた圌らに感謝しおいたす。OpenPGP゚コシステムは必死に倚様性を远加する必芁がありたす。しかし、これは、セキュリティが重芁な状況で䜿甚するための未熟な補品をリリヌスするための蚀い蚳にはなりたせん。



セキュリティが重芁なむンフラストラクチャ



残念ながら、RNPは、私の意芋では、安党に展開できる状態にはただ達しおいたせん。 Enigmailは、デヌタのプラむバシヌを懞念する人々だけでなく、自分自身の安党ず察話者の安党を気にするゞャヌナリスト、掻動家、匁護士によっおも䜿甚されおいたした。 2017幎のむンタビュヌで、ベンゞャミン・むスマむル、アゞア倪平掋地域の章の頭 囜境なき蚘者団は、蚀った



私たちは、䞻に、圓瀟の゜ヌスず自由に通信するためにGPGを䜿甚しおいたす。圌らが人暩ずこれらの暩利の䟵害に぀いお私たちに提䟛する情報は圌らにずっお安党ではないので、私たちの䌚話の完党性を保護する必芁がありたす。   çµ„織からの 



ベンゞャミン・むスマむルぞのむンタビュヌ囜境なき蚘者団



サンダヌバヌドは、この移行期間䞭であっおも、これらのナヌザヌに可胜な限り安党な䜓隓を提䟛し続けるこずが重芁です。



RNPおよびサブキヌバむンディング眲名



セコむアで型を䜿甚しおAPIの誀甚を困難にする方法に぀いお説明する際に、わずか数行のコヌドでキヌの有効期限を確認する方法を瀺したした。たず、OpenPGPたたはRNPに䞍慣れな人に、RNPを䜿甚しお同じ機胜を実装する方法を瀺す䟋から始めたいず思いたした。次のコヌドは、蚌明曞サブキヌキヌを繰り返し凊理し、各サブキヌの有効期限を衚瀺したす。泚意ずしお、有効期限はサブキヌバむンディング眲名に保存され、倀0は、キヌが無期限になるこずはないこずを瀺したす。 



int i;
for (i = 0; i < sk_count; i ++) {
  rnp_key_handle_t sk;
  err = rnp_key_get_subkey_at(key, i, &sk);
  if (err) {
    printf("rnp_key_get_subkey_at(%d): %x\n", i, err);
    return 1;
  }
 
  uint32_t expiration_time;
  err = rnp_key_get_expiration(sk, &expiration_time);
  if (err) {
    printf("#%d (%s). rnp_key_get_expiration: %x\n",
           i + 1, desc[i], err);
  } else {
    printf("#%d (%s) expires %"PRIu32" seconds after key's creation time.\n",
           i + 1, desc[i],
           expiration_time);
  }
}
      
      





このコヌドを、5぀のサブキヌを持぀蚌明曞でテストしたした。最初のサブキヌには有効なバむンディング眲名があり、有効期限はありたせん。2぀目は有効なバむンディング眲名を持ち、将来期限切れになりたす。3番目は有効なバむンディング眲名を持っおいたすが、すでに有効期限が切れおいたす。4番目には無効なバむンディング眲名があり、それに埓っおサブキヌは将来期限切れになりたす。5番目の眲名にはアンカヌがたったくありたせん。出力は次のずおりです。



#1 (doesn't expire) expires 0 seconds after key's creation time.

#2 (expires) expires 94670781 seconds after key's creation time.

#3 (expired) expires 86400 seconds after key's creation time.

#4 (invalid sig) expires 0 seconds after key's creation time.

#5 (no sig) expires 0 seconds after key's creation time.
      
      







たず、サブキヌに有効なバむンディングシグネチャがあるか、無効なバむンディングシグネチャがあるか、たたはバむンディングシグネチャがたったくないかに関係なく、rnp_key_get_expiration呌び出しが成功するこずに泚意しおください。ドキュメントを読むず  、この動䜜は少し意倖に思えたす。それは蚀う 



       .

 : 0 ,     .

      
      





キヌの有効期限はバむンディング眲名に栌玍されおいるため、OpenPGPの専門家ずしお、私はそれを次のように理解しおいたす。rnp_key_get_expirationの呌び出しは、サブキヌに有効なバむンディング眲名がある堎合にのみ成功したす。実際、有効なバむンディング眲名がない堎合、関数はデフォルトで0になりたす。これは、䞊蚘のコメントを前提ずしお、APIナヌザヌは次のように解釈するこずを期埅したす。このキヌは無期限に有効です。



このコヌドを改善するには、最初に、キヌに有効なバむンディング眲名があるかどうかを確認する必芁がありたす。最近、CVE-2021-23991に察凊するために、それを実行するためのいく぀かの関数がRNPに远加されたした  。特に、RNP開発者 キヌが有効かどうかに関する情報を返すrnp_key_is_valid関数が远加されたした。このアドオンは状況を改善したすが、開発者はこれらのセキュリティクリティカルチェックを実行するかどうかを明瀺的に遞択する必芁がありたすSequoiaの堎合のように、すでに蚭定されおいるチェックを明瀺的に攟棄するのではありたせん。セキュリティチェックは有甚な䜜業を行うこずではないため、忘れがちです。セキュリティチェックが実行されおいなくおもコヌドは機胜したす。たた、䜕をチェックするかを正しく遞択するには専門知識が必芁なため、チェックは忘れられたす。



次のコヌドはセキュリティチェックを提䟛し、rnp_key_is_validが無効ず芋なすキヌをスキップしたす。



int i;
for (i = 0; i < sk_count; i ++) {
  rnp_key_handle_t sk;
  err = rnp_key_get_subkey_at(key, i, &sk);
  if (err) {
    printf("rnp_key_get_subkey_at(%d): %x\n", i, err);
    return 1;
  }
 
  bool is_valid = false;
  err = rnp_key_is_valid(sk, &is_valid);
  if (err) {
    printf("rnp_key_is_valid: %x\n", err);
    return 1;
  }
 
  if (! is_valid) {
    printf("#%d (%s) is invalid, skipping.\n",
           i + 1, desc[i]);
    continue;
  }
 
  uint32_t expiration_time;
  err = rnp_key_get_expiration(sk, &expiration_time);
  if (err) {
    printf("#%d (%s). rnp_key_get_expiration: %x\n",
           i + 1, desc[i], err);
  } else {
    printf("#%d (%s) expires %"PRIu32" seconds after key's creation time.\n",
           i + 1, desc[i],
           expiration_time);
  }
}

      
      







出力



#1 (doesn't expire) expires 0 seconds after key's creation time.

#2 (expires) expires 94670781 seconds after key's creation time.

#3 (expired) is invalid, skipping.

#4 (invalid sig) is invalid, skipping.

#5 (no sig) is invalid, skipping.
      
      







このコヌドは、有効なバむンディング眲名を持たない2぀のキヌを正しくスキップしたすが、期限切れのキヌもスキップしたす。これは、この関数が「...有効期限をチェックする」ずドキュメントで譊告されおいる堎合でも、おそらく私たちが望んでいたものではありたせん。



期限切れのキヌや蚌明曞を䜿甚したくない堎合もありたすが、それらに頌るこずもありたす。たずえば、ナヌザヌがキヌの曎新を忘れた堎合、ナヌザヌはキヌの有効期限が切れおいるこずを確認しおから蚌明曞を確認し、この堎合はキヌを曎新できる必芁がありたす。gpg --list-keys



 æœŸé™åˆ‡ã‚Œã®ã‚­ãƒŒã¯è¡šç€ºã•れ たせんが、蚌明曞を線集するずきに、期限切れのサブキヌは匕き続き衚瀺されるため、ナヌザヌは有効性を曎新できたす。



$ gpg --edit-key 93D3A2B8DF67CE4B674999B807A5D8589F2492F9

Secret key is available.

sec  ed25519/07A5D8589F2492F9

     created: 2021-04-26  expires: 2024-04-26  usage: C   

     trust: unknown       validity: unknown

ssb  ed25519/1E2F512A0FE99515

     created: 2021-04-27  expires: never       usage: S   

ssb  cv25519/8CDDC2BC5EEB61A3

     created: 2021-04-26  expires: 2024-04-26  usage: E   

ssb  ed25519/142D550E6E6DF02E

     created: 2021-04-26  expired: 2021-04-27  usage: S   

[ unknown] (1). Alice <alice@example.org>
      
      







期限切れのキヌを無効にすべきでない状況は他にもありたす。たずえば、アリスがボブに「1幎間100ナヌロを支払いたす」ずいう眲名付きメッセヌゞを送信し、眲名キヌの有効期限が6か月であるずしたす。 1幎が終わるず、アリスはこの眲名に基づいおボブに借りがありたすかはい、そう思いたす。眲名は、添付されたずきに有効でした。キヌがすでに期限切れになっおいるずいう事実は関係ありたせん。もちろん、キヌの有効期限が切れた堎合、有効期限が切れた時点でキヌによっお封印された眲名は無効ず芋なされたす。同様に、メッセヌゞは期限切れのキヌで暗号化しないでください。



぀たり、キヌを有効ず芋なす必芁があるかどうかは、状況䟝存です。rnp_key_is_validは䜕もないよりはたしですが、名前にもかかわらず、この関数はキヌが有効かどうかを刀断する䞊で非垞に埮劙な違いがありたす。



そのコミットの䞀郚ずしお、2番目の関数が远加されたした  rnp_key_valid_till



。この関数は、「キヌが有効であるず芋なされる前のタむムスタンプ...キヌが有効でなかった堎合、倀ずしおれロが返されたす」を返したす。この関数を䜿甚するず、キヌが有効であったかどうかを刀断できたす。このため、この関数がれロ以倖の倀を返すかどうかを確認する必芁がありたす。



int i;
for (i = 0; i < sk_count; i ++) {
  rnp_key_handle_t sk;
  err = rnp_key_get_subkey_at(key, i, &sk);
  if (err) {
    printf("rnp_key_get_subkey_at(%d): %x\n", i, err);
    return 1;
  }
 
  uint32_t valid_till;
  err = rnp_key_valid_till(sk, &valid_till);
  if (err) {
    printf("rnp_key_valid_till: %x\n", err);
    return 1;
  }
 
  printf("#%d (%s) valid till %"PRIu32" seconds after epoch; ",
         i + 1, desc[i], valid_till);
 
  if (valid_till == 0) {
    printf("invalid, skipping.\n");
    continue;
  }
 
  uint32_t expiration_time;
  err = rnp_key_get_expiration(sk, &expiration_time);
  if (err) {
    printf("rnp_key_get_expiration: %x\n", err);
  } else {
    printf("expires %"PRIu32" seconds after key's creation time.\n",
           expiration_time);
  }
}
      
      







結果



#1 (doesn't expire) valid till 1714111110 seconds after epoch; expires 0 seconds after key's creation time.

#2 (expires) valid till 1714111110 seconds after epoch; expires 94670781 seconds after key's creation time.

#3 (expired) valid till 1619527593 seconds after epoch; expires 86400 seconds after key's creation time.

#4 (invalid sig) valid till 0 seconds after epoch; invalid, skipping.

#5 (no sig) valid till 0 seconds after epoch; invalid, skipping.
      
      







今、私たちは私たちが望む結果を埗たした最初の3぀のサブキヌの正しい有効期限を衚瀺し、最埌の2぀のサブキヌが無効であるこずも瀺したす。



しかし、詳しく芋おみたしょう  rnp_key_valid_till



。たず、OpenPGPでは、キヌの有効期限は、キヌが䜜成されたずきからの笊号なし32ビットむンデントずしお、これも笊号なし32ビット圢匏で栌玍されたす。したがっお、関数はより広い型を䜿甚するか、少なくずもコヌドのオヌバヌフロヌをチェックする必芁がありたす。 私はこの問題を  報告したしたが、すでに修正されおいたす。



しかし、このわき柱を無芖しおも、機胜はただ奇劙です。 OpenPGPでは、キヌは数期間有効である可胜性がありたす。キヌの有効期限が7月1日で、ナヌザヌが7月10日からのみ曎新するずしたす。 7月1日から7月10日たでの期間䞭、キヌは無効でした。この間に生成された眲名も無効ず芋なす必芁がありたす。では、考慮される関数はそのようなキヌに察しお䜕を返す必芁がありたすかさらに重芁なこずに、そのようなAPIのナヌザヌは結果をどのように解釈する必芁がありたすかそのようなAPIを䜿甚するこずはたったく適切ですか  はい、私は尋ねたした。



セコむアでは、私たちは反察の方向に進みたした。キヌが有効であるずいう情報を返す代わりに、状況を反転させたす。 APIナヌザヌは次のように尋ねる可胜性がありたす。  このキヌは時刻tで有効ですか。私たちの経隓では、これは私たちが知っおいるすべおの堎合に実際に必芁ずされたすべおです。



RNPAPIでこの特定の問題を具䜓的に取り䞊げおいるずは思わないでください。これは私が最近考えおいた 合䜵症です。 Thunderbird甚の代替OpenPGPバック゚ンドを䜜成するためにRNPAPIを再実装したずき  、倚くの同様の問題に盎面し  たした。



結論



RNP開発者が犯した間違いは理解でき、蚀い蚳になりたす。 OpenPGPは、他の倚くのプロトコルず同様に耇雑です。ただし、ファむル暗号化ツヌルだけでなく、柔軟性ず信頌性の高いPKIを維持しようずすれば、倧幅に簡玠化でき たす。 



ただし、RNPAPIは危険です。 Thunderbirdは   ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãŒé‡èŠãªçŠ¶æ³ã§äœ¿ç”šã•ã‚ŒãŸã™ã€‚ 2017幎のむンタビュヌで、   çµ„織犯眪ず腐敗研究センタヌOCCRPのMichal'Rysiek 'Wozniakは、誰かの呜が危機に瀕しおいるこずを明らかにしたした。



私は本圓に匷く、我々はGnuPGのにすべおのこの時間を利甚しおいなかった堎合、圓瀟の情報提䟛者ずゞャヌナリストの倚くが危険にさらされたり、バヌの埌ろであろうず信じおいる...



むンタビュヌ ãš  ミハル「Rysiek」りォズニアック汚職や組織の研究センタヌから犯眪



これはThunderbirdにどのように圱響したすか 3぀の遞択肢がありたす。たず、ThunderbirdはEnigmailに戻る可胜性がありたす。 EnigmailをThunderbird78に移怍するのは難しいず思うかもしれたせんが、倚くのThunderbird開発者から、これはリフトで技術的に実珟可胜であるず聞いおいたす。しかし、ThunderbirdがEnigmailから離れるこずを遞んだ理由の1぀は、Enigmail開発者がナヌザヌがGnuPGを正しくむンストヌルしお構成するのを支揎するために膚倧な時間を費やさなければならなかったこずです。したがっお、このパスは理想的ではありたせん。



次に、Thunderbirdは別のOpenPGP実装に切り替えるこずができたす。最近はたくさんありたす。   ã‹ã‚‰éžæŠžã—たす。個人的には、サンダヌバヌドはセコむアに切り替えるべきだったず思いたす。もちろん、私はセコむアの開発者なので、偏芋がありたす。しかし、それはお金の問題ではありたせん。資金は私に支払いたす。自由垂堎では、おそらく今の収入の2倍の金額が提䟛されたす。私はナヌザヌの保護に取り組んでいたす。ただし、Sequoia APIず実装の利点は別ずしお、この堎合、Thunderbirdももう1぀の点で勝ちたす。぀たり、この実装はすでに機胜しおいたす。数週間前、Thunderbirdの代替OpenPGPバック゚ンドであるOctopusをリリヌスしたした 。 RNPず機胜的に同等であるだけでなく、gpgずの統合など、以前は欠萜しおいた倚くの機胜があり、いく぀かのセキュリティホヌルにパッチを適甚し、いく぀かの非機胜芁件を満たしたした。



第䞉に、ThunderbirdはOpenPGPの䜿甚を完党に停止できた可胜性がありたす。この決定は私には合いたせん。しかし、Thunderbirdの最も脆匱なナヌザヌのセキュリティに぀いお䜕床か懞念しおおり、OpenPGPサポヌトをたったく提䟛しない方が珟状よりも安党であるず考えおいたす。






MacleodVPSはAPI開発に理想的です。



䞊蚘のリンクを䜿甚するか、バナヌをクリックしお登録するず、任意の構成のサヌバヌをレンタルした最初の月が10割匕になりたす。






All Articles