2024年12月4日に発表された変更点

2024年12月4日にProtocol Buffersに発表された変更点。

v30では、C++のProtobufデバッグAPI(Protobuf AbslStringify、proto2::ShortFormatproto2::Utf8FormatMessage::DebugStringMessage::ShortDebugStringMessage::Utf8DebugStringを含む)を修正し、debug_redactで注釈された機密フィールドを秘匿する予定です。これらのAPIの出力にはプロセスごとのランダムなプレフィックスが含まれるため、Protobuf TextFormatパーサーでは解析できなくなります。

動機

現在、ProtobufのデバッグAPIは、プロトのすべてのフィールドを人間が読める形式で出力します。これにより、開発者が誤って機密フィールドを含むProtobufのデバッグ出力をログに記録し、プライバシーインシデントにつながる可能性があります。

機密フィールドを注釈する方法

フィールドを機密としてマークする方法は2つあります。

  • フィールドオプションdebug_redact = trueを直接フィールドにマークします。

    message Foo {
      optional string secret = 1 [debug_redact = true];
    }
    
  • proto2.FieldOptionsを拡張してEnum型のフィールド注釈を既に定義しており、この注釈の特定の値が秘匿したいフィールドの注釈に使用されている場合、これらの値にdebug_redact = trueと注釈を付けることができます。そのような値で注釈されたすべてのフィールドが秘匿されます。

    package my.package;
    
    extend proto2.FieldOptions {
      # The existing field annotation
      optional ContentType content_type = 1234567;
    };
    
    enum ContentType {
      PUBLIC = 0;
      SECRET = 1 [debug_redact = true];
    };
    
    message Foo {
      # will not be redacted
      optional string public_info = 1 [
        (my.package.content_type) = PUBLIC
      ];
      # will be redacted
      optional string secret = 1 [
        (my.package.content_type) = SECRET
      ];
    }
    

新しいデバッグフォーマット

既存のデバッグフォーマットと比較して、新しいデバッグフォーマットには2つの大きな違いがあります。

  • debug_redactで注釈された機密フィールドは、出力フォーマットで自動的に秘匿されます。
  • 出力フォーマットにはプロセスごとのランダムなプレフィックスが含まれるため、TextFormatパーサーでは解析できなくなります。

2つ目の変更点は、プロトに機密フィールドが含まれているかどうかにかかわらず適用されるため、デバッグ出力はプロトの内容にかかわらず常に逆シリアル化できないことが保証されます。