プログラマヌず゚ンゞニアの民俗孊パヌト3





バグが時々完党に信じられないほどの症状を瀺す方法に぀いおのむンタヌネットからの物語のコレクションの最埌の郚分。パヌト1、パヌト2。



時々できなかった小さなSSH



これは、私が参加できた幞運なこずに、最も゚キサむティングなバグハントの1぀に぀いおの話です。



私が働いおいたAdGearTechnologies Inc.では、すべおがSSHで管理されおいたした。ラむブストリヌミングでも、管理、監芖、展開、ログ収集に䜿甚しおいたす。このプロトコルは堅牢で信頌性が高く、ネむティブUnixツヌルの予枬可胜性を備えおおり、正垞に機胜したす。



しかし、特定の時間やホストの参照がない手玙が、プロトコルが機胜しおいないこずを私たちに告げたこずがありたす。



タむムアりト



ロンドンのデヌタセンタヌのマシンは、ログファむルをモントリオヌルのデヌタセンタヌに送信するずきにクラッシュするこずがありたした。このタスクはCronから定期的に実行され、倱敗は次のように珟れたした。



  • Cronの電子メヌルはSSHの問題を報告したした。

    • 時々それはフリヌズしたす。
    • タむムアりト゚ラヌなしで終了する堎合がありたす。
  • 内郚ヘルスチェックで、Nagiosはモントリオヌルのデヌタが欠萜しおいるこずを譊告したす。


ロンドンの車にログむンし、手動でコマンドpushを起動するず、正垞に機胜したした。私たちはそれを䞀時的なネットワヌクの問題にたで絞り蟌みたした。



タむムアりト



しかし、クラッシュはランダムに繰り返され続けたした。 1日1回、1日2回、金曜日の朝、1時間に数回。それが悪化しおいるこずは明らかでした。問題が䜕であるかがわかるたで、手動でファむルをプッシュし続けたした。



ロンドンずモントリオヌルの間には17のホップがありたした。パケットの遅延ず損倱のプロファむルを䜜成したした。パケットの1〜3が2、3ホップで倱われたこずが刀明したした。ロンドンデヌタセンタヌの運甚郚門ず協力しお、ルヌト倉曎を申請したした。



ロンドン垂民がパケット損倱情報をチェックしおいる間、私たちはロンドンから2番目に向かう途䞭でランダムなタむムアりトを探し始めたしたモントリオヌルのデヌタセンタヌ。このルヌトのホップは、パケットを倱ったものではなく、異なっおいたした。損倱は​​䞻な問題ではないず刀断し、ロンドン垂民は、パケットの損倱やタむムアりトを再珟できず、すべおが順調に芋えたず報告したした。



黙瀺録



悪いCronメヌルを手動で転送しおいるずきに、興味深いパタヌンに気づきたした。ファむルは高速で正垞に転送されたか、たったく転送されずにタむムアりト時にハングしたした。ファむルが䜎速で正垞にダりンロヌドされるケヌスはありたせん。



方皋匏からほずんどのデヌタを削陀するこずで、単玔なバニラSSHを䜿甚しおスクリプトを再䜜成するこずができたした。ロンドンのデヌタセンタヌでは、「SSH mtl-machine」サヌバヌがタスクをすぐに完了するか、ハングしお接続を確立できたせんでした。驚きが倧きくなり始めたした。



パッケヌゞはどこに行きたしたか



モントリオヌルのSSHサヌバヌの構成ずシステムを3回チェックしたした。



  • DNSサヌバヌは迅速に応答したした。
  • DNS逆匕き参照ゟヌンが無効になっおいたす。
  • クラむアント接続の最倧数は十分に倧きかった。
  • 私たちは攻撃されたせんでした。
  • チャネルは詰たっおいたせんでした。


さらに、䜕かが機胜しおいなくおも、モントリオヌルの2぀の異なるデヌタセンタヌで䜜業しおいるずフリヌズが発生したす。さらに、ロンドン以倖のデヌタセンタヌはモントリオヌルずの通信に成功したした。぀たり、問題はロンドンに関連しおいたのです。



tcpdumpを実行し、パッケヌゞを監芖したした。Pcapsを䜿甚しお取埗され、Wiresharkにロヌドされた䞀般的なダむナミクスずデヌタに関心がありたした。パケットの損倱ず再送信の兆候が芋られたしたが、すべおが最小限であり、心配する必芁はありたせんでした。



次に、SSH通信が正垞に確立された状況での接続党䜓を分析し、次に、SSH通信がハングした状況での接続を分析したした。



ロンドンからモントリオヌルぞの接続が途絶えたずき、私たちは次の結論に達したした。



  • TCP接続の確立はうたくいきたした。
  • サヌビスSSH情報がやり取りされたした。必芁に応じお、通垞のTCPackパケットがありたした。
  • 特定のパッケヌゞがロンドンから送信され、モントリオヌルで受信されたした。
  • 同じパッケヌゞがロンドンから数回再送信され、モントリオヌルで受け取られたした。
  • モントリオヌルは単にこれに答えたせん


モントリオヌルが応答しなかった理由は明らかではありたせんでしたこのロンドンが再びデヌタを送信しおいるため。レむダヌ4プロトコルがハングしおいたため、接続がハングしたした。さらに゚キサむティングなのは、ロンドンで繰り返されるSSH送信を䞭断し、すぐに再起動するず、正垞に機胜するずいう事実です。この堎合、tcpdumpは、モントリオヌルがパッケヌゞを受け取り、それに応答したこずを瀺し、䜜業は続行されたした。



ロンドンのSSHクラむアントで、詳现なデバッグ-vvvを有効にし、これらのログ゚ントリの埌、接続がハングしたした。



debug2: kex_parse_kexinit: first_kex_follows 0 
debug2: kex_parse_kexinit: reserved 0 
debug2: mac_setup: found hmac-md5
debug1: kex: server->client aes128-ctr hmac-md5 none
debug2: mac_setup: found hmac-md5
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP


「SSHhangSSH2_MSG_KEX_DH_GEX_GROUP」をグヌグルで怜玢したずころ、Wi-Fiの問題からWindowsのTCPバグ、バグのあるルヌタヌがTCPフラグメントを倱うたで、倚くの結果が埗られたした。 LANの解決策の1぀は、パスのMSSを蚈算し、この倀をルヌトの䞡端のMTUずしお蚭定するこずでした。



ロンドンサヌバヌのMTUを1500から枛らし続けたした。魔法の倀である576に到達するたで、それは圹に立ちたせんでした。その埌、SSHは再びハングしたせんでした。 SSHルヌプを䜿甚しおスクリプトを実行しおいたしたが、必芁に応じお、MTUを1500に戻すこずでタむムアりトを発生させるか、576を蚭定しおタむムアりトを取り陀くこずができたした。残念ながら、これらはパブリック広告サヌバヌであり、MTUを1500にグロヌバルに割り圓おおも問題は解決したせん。ただし、パケットの断片化たたは再構築のプロセスはおそらくどこかで壊れおいるこずはすでに前述したした。



tcpdumpを䜿甚しお受信したパケットのチェックに戻りたしょう。断片化の兆候はありたせんでした。受信したパケットのサむズは、送信したパケットのサむズず同じでした。䜕かがバむト576+でパケットを断片化した堎合、䜕かが正垞に再組み立おしおいたした。



きらめききらめき、カヌブスタヌ



分析を深く掘り䞋げおいくず、tcpdump -s 0 -Xヘッダヌだけでなく、完党なパケットダンプを調べたした。成功した送信からのマゞックパケットず倱敗した送信からのパケットを比范するず、TCP / IPヘッダヌを陀いお、ほずんど違いは芋぀かりたせんでした。しかし、これが576バむトのマヌクを通過するのに十分なデヌタを含むTCP接続の最初のパケットであるこずは明らかでした。以前のパッケヌゞはすべおはるかに小さかった。



倱敗したディスパッチからの同じパケットを、ロンドンを出おモントリオヌルに到着した圢で比范するず、私の目は䜕かに気づきたした。埮劙なこずのために、そしお私は疲劎のためにそれを払いのけたしたそれは金曜日の倜遅くでした。しかし、いく぀かの曎新ず比范の埌、私はもはや想像しおいたせんでした。



これは、ロンドンを出た埌のパケットの倖芳ですIPアドレスを識別する最初の数バむトを陀く
0x0040:  0b7c aecc 1774 b770 ad92 0000 00b7 6563  .|...t.p......ec
0x0050:  6468 2d73 6861 322d 6e69 7374 7032 3536  dh-sha2-nistp256
0x0060:  2c65 6364 682d 7368 6132 2d6e 6973 7470  ,ecdh-sha2-nistp
0x0070:  3338 342c 6563 6468 2d73 6861 322d 6e69  384,ecdh-sha2-ni
0x0080:  7374 7035 3231 2c64 6966 6669 652d 6865  stp521,diffie-he
0x0090:  6c6c 6d61 6e2d 6772 6f75 702d 6578 6368  llman-group-exch
0x00a0:  616e 6765 2d73 6861 3235 362c 6469 6666  ange-sha256,diff
0x00b0:  6965 2d68 656c 6c6d 616e 2d67 726f 7570  ie-hellman-group
0x00c0:  2d65 7863 6861 6e67 652d 7368 6131 2c64  -exchange-sha1,d
0x00d0:  6966 6669 652d 6865 6c6c 6d61 6e2d 6772  iffie-hellman-gr
0x00e0:  6f75 7031 342d 7368 6131 2c64 6966 6669  oup14-sha1,diffi
0x00f0:  652d 6865 6c6c 6d61 6e2d 6772 6f75 7031  e-hellman-group1
0x0100:  2d73 6861 3100 0000 2373 7368 2d72 7361  -sha1...#SSH-rsa
0x0110:  2c73 7368 2d64 7373 2c65 6364 7361 2d73  ,SSH-dss,ecdsa-s
0x0120:  6861 322d 6e69 7374 7032 3536 0000 009d  ha2-nistp256....
0x0130:  6165 7331 3238 2d63 7472 2c61 6573 3139  aes128-ctr,aes19
0x0140:  322d 6374 722c 6165 7332 3536 2d63 7472  2-ctr,aes256-ctr
0x0150:  2c61 7263 666f 7572 3235 362c 6172 6366  ,arcfour256,arcf
0x0160:  6f75 7231 3238 2c61 6573 3132 382d 6362  our128,aes128-cb
0x0170:  632c 3364 6573 2d63 6263 2c62 6c6f 7766  c,3des-cbc,blowf
0x0180:  6973 682d 6362 632c 6361 7374 3132 382d  ish-cbc,cast128-
0x0190:  6362 632c 6165 7331 3932 2d63 6263 2c61  cbc,aes192-cbc,a
0x01a0:  6573 3235 362d 6362 632c 6172 6366 6f75  es256-cbc,arcfou
0x01b0:  722c 7269 6a6e 6461 656c 2d63 6263 406c  r,rijndael-cbc@l
0x01c0:  7973 6174 6f72 2e6c 6975 2e73 6500 0000  ysator.liu.se...
0x01d0:  9d61 6573 3132 382d 6374 722c 6165 7331  .aes128-ctr,aes1
0x01e0:  3932 2d63 7472 2c61 6573 3235 362d 6374  92-ctr,aes256-ct
0x01f0:  722c 6172 6366 6f75 7232 3536 2c61 7263  r,arcfour256,arc
0x0200:  666f 7572 3132 382c 6165 7331 3238 2d63  four128,aes128-c
0x0210:  6263 2c33 6465 732d 6362 632c 626c 6f77  bc,3des-cbc,blow
0x0220:  6669 7368 2d63 6263 2c63 6173 7431 3238  fish-cbc,cast128
0x0230:  2d63 6263 2c61 6573 3139 322d 6362 632c  -cbc,aes192-cbc,
0x0240:  6165 7332 3536 2d63 6263 2c61 7263 666f  aes256-cbc,arcfo
0x0250:  7572 2c72 696a 6e64 6165 6c2d 6362 6340  ur,rijndael-cbc@
0x0260:  6c79 7361 746f 722e 6c69 752e 7365 0000  lysator.liu.se..
0x0270:  00a7 686d 6163 2d6d 6435 2c68 6d61 632d  ..hmac-md5,hmac-
0x0280:  7368 6131 2c75 6d61 632d 3634 406f 7065  sha1,umac-64@ope
0x0290:  6e73 7368 2e63 6f6d 2c68 6d61 632d 7368  nSSH.com,hmac-sh
0x02a0:  6132 2d32 3536 2c68 6d61 632d 7368 6132  a2-256,hmac-sha2
0x02b0:  2d32 3536 2d39 362c 686d 6163 2d73 6861  -256-96,hmac-sha
0x02c0:  322d 3531 322c 686d 6163 2d73 6861 322d  2-512,hmac-sha2-
0x02d0:  3531 322d 3936 2c68 6d61 632d 7269 7065  512-96,hmac-ripe
0x02e0:  6d64 3136 302c 686d 6163 2d72 6970 656d  md160,hmac-ripem
0x02f0:  6431 3630 406f 7065 6e73 7368 2e63 6f6d  d160@openSSH.com
0x0300:  2c68 6d61 632d 7368 6131 2d39 362c 686d  ,hmac-sha1-96,hm
0x0310:  6163 2d6d 6435 2d39 3600 0000 a768 6d61  ac-md5-96....hma
0x0320:  632d 6d64 352c 686d 6163 2d73 6861 312c  c-md5,hmac-sha1,
0x0330:  756d 6163 2d36 3440 6f70 656e 7373 682e  umac-64@openSSH.
0x0340:  636f 6d2c 686d 6163 2d73 6861 322d 3235  com,hmac-sha2-25
0x0350:  362c 686d 6163 2d73 6861 322d 3235 362d  6,hmac-sha2-256-
0x0360:  3936 2c68 6d61 632d 7368 6132 2d35 3132  96,hmac-sha2-512
0x0370:  2c68 6d61 632d 7368 6132 2d35 3132 2d39  ,hmac-sha2-512-9
0x0380:  362c 686d 6163 2d72 6970 656d 6431 3630  6,hmac-ripemd160
0x0390:  2c68 6d61 632d 7269 7065 6d64 3136 3040  ,hmac-ripemd160@
0x03a0:  6f70 656e 7373 682e 636f 6d2c 686d 6163  openSSH.com,hmac
0x03b0:  2d73 6861 312d 3936 2c68 6d61 632d 6d64  -sha1-96,hmac-md
0x03c0:  352d 3936 0000 0015 6e6f 6e65 2c7a 6c69  5-96....none,zli
0x03d0:  6240 6f70 656e 7373 682e 636f 6d00 0000  b@openSSH.com...
0x03e0:  156e 6f6e 652c 7a6c 6962 406f 7065 6e73  .none,zlib@opens
0x03f0:  7368 2e63 6f6d 0000 0000 0000 0000 0000  sh.com..........
0x0400:  0000 0000 0000 0000 0000 0000            ............




そしお、これはモントリオヌルに到着したずきの同じパッケヌゞの様子です
0x0040:  0b7c aecc 1774 b770 ad92 0000 00b7 6563  .|...t.p......ec
0x0050:  6468 2d73 6861 322d 6e69 7374 7032 3536  dh-sha2-nistp256
0x0060:  2c65 6364 682d 7368 6132 2d6e 6973 7470  ,ecdh-sha2-nistp
0x0070:  3338 342c 6563 6468 2d73 6861 322d 6e69  384,ecdh-sha2-ni
0x0080:  7374 7035 3231 2c64 6966 6669 652d 6865  stp521,diffie-he
0x0090:  6c6c 6d61 6e2d 6772 6f75 702d 6578 6368  llman-group-exch
0x00a0:  616e 6765 2d73 6861 3235 362c 6469 6666  ange-sha256,diff
0x00b0:  6965 2d68 656c 6c6d 616e 2d67 726f 7570  ie-hellman-group
0x00c0:  2d65 7863 6861 6e67 652d 7368 6131 2c64  -exchange-sha1,d
0x00d0:  6966 6669 652d 6865 6c6c 6d61 6e2d 6772  iffie-hellman-gr
0x00e0:  6f75 7031 342d 7368 6131 2c64 6966 6669  oup14-sha1,diffi
0x00f0:  652d 6865 6c6c 6d61 6e2d 6772 6f75 7031  e-hellman-group1
0x0100:  2d73 6861 3100 0000 2373 7368 2d72 7361  -sha1...#SSH-rsa
0x0110:  2c73 7368 2d64 7373 2c65 6364 7361 2d73  ,SSH-dss,ecdsa-s
0x0120:  6861 322d 6e69 7374 7032 3536 0000 009d  ha2-nistp256....
0x0130:  6165 7331 3238 2d63 7472 2c61 6573 3139  aes128-ctr,aes19
0x0140:  322d 6374 722c 6165 7332 3536 2d63 7472  2-ctr,aes256-ctr
0x0150:  2c61 7263 666f 7572 3235 362c 6172 6366  ,arcfour256,arcf
0x0160:  6f75 7231 3238 2c61 6573 3132 382d 6362  our128,aes128-cb
0x0170:  632c 3364 6573 2d63 6263 2c62 6c6f 7766  c,3des-cbc,blowf
0x0180:  6973 682d 6362 632c 6361 7374 3132 382d  ish-cbc,cast128-
0x0190:  6362 632c 6165 7331 3932 2d63 6263 2c61  cbc,aes192-cbc,a
0x01a0:  6573 3235 362d 6362 632c 6172 6366 6f75  es256-cbc,arcfou
0x01b0:  722c 7269 6a6e 6461 656c 2d63 6263 406c  r,rijndael-cbc@l
0x01c0:  7973 6174 6f72 2e6c 6975 2e73 6500 0000  ysator.liu.se...
0x01d0:  9d61 6573 3132 382d 6374 722c 6165 7331  .aes128-ctr,aes1
0x01e0:  3932 2d63 7472 2c61 6573 3235 362d 6374  92-ctr,aes256-ct
0x01f0:  722c 6172 6366 6f75 7232 3536 2c61 7263  r,arcfour256,arc
0x0200:  666f 7572 3132 382c 6165 7331 3238 2d63  four128,aes128-c
0x0210:  6263 2c33 6465 732d 6362 632c 626c 6f77  bc,3des-cbc,blow
0x0220:  6669 7368 2d63 6263 2c63 6173 7431 3238  fish-cbc,cast128
0x0230:  2d63 6263 2c61 6573 3139 322d 6362 632c  -cbc,aes192-cbc,
0x0240:  6165 7332 3536 2d63 6263 2c61 7263 666f  aes256-cbc,arcfo
0x0250:  7572 2c72 696a 6e64 6165 6c2d 6362 7340  ur,rijndael-cbs@
0x0260:  6c79 7361 746f 722e 6c69 752e 7365 1000  lysator.liu.se..
0x0270:  00a7 686d 6163 2d6d 6435 2c68 6d61 732d  ..hmac-md5,hmas-
0x0280:  7368 6131 2c75 6d61 632d 3634 406f 7065  sha1,umac-64@ope
0x0290:  6e73 7368 2e63 6f6d 2c68 6d61 632d 7368  nSSH.com,hmac-sh
0x02a0:  6132 2d32 3536 2c68 6d61 632d 7368 7132  a2-256,hmac-shq2
0x02b0:  2d32 3536 2d39 362c 686d 6163 2d73 7861  -256-96,hmac-sxa
0x02c0:  322d 3531 322c 686d 6163 2d73 6861 322d  2-512,hmac-sha2-
0x02d0:  3531 322d 3936 2c68 6d61 632d 7269 7065  512-96,hmac-ripe
0x02e0:  6d64 3136 302c 686d 6163 2d72 6970 756d  md160,hmac-ripum
0x02f0:  6431 3630 406f 7065 6e73 7368 2e63 7f6d  d160@openSSH.c.m
0x0300:  2c68 6d61 632d 7368 6131 2d39 362c 786d  ,hmac-sha1-96,xm
0x0310:  6163 2d6d 6435 2d39 3600 0000 a768 7d61  ac-md5-96....h}a
0x0320:  632d 6d64 352c 686d 6163 2d73 6861 312c  c-md5,hmac-sha1,
0x0330:  756d 6163 2d36 3440 6f70 656e 7373 782e  umac-64@openssx.
0x0340:  636f 6d2c 686d 6163 2d73 6861 322d 3235  com,hmac-sha2-25
0x0350:  362c 686d 6163 2d73 6861 322d 3235 362d  6,hmac-sha2-256-
0x0360:  3936 2c68 6d61 632d 7368 6132 2d35 3132  96,hmac-sha2-512
0x0370:  2c68 6d61 632d 7368 6132 2d35 3132 3d39  ,hmac-sha2-512=9
0x0380:  362c 686d 6163 2d72 6970 656d 6431 3630  6,hmac-ripemd160
0x0390:  2c68 6d61 632d 7269 7065 6d64 3136 3040  ,hmac-ripemd160@
0x03a0:  6f70 656e 7373 682e 636f 6d2c 686d 7163  openSSH.com,hmqc
0x03b0:  2d73 6861 312d 3936 2c68 6d61 632d 7d64  -sha1-96,hmac-}d
0x03c0:  352d 3936 0000 0015 6e6f 6e65 2c7a 7c69  5-96....none,z|i
0x03d0:  6240 6f70 656e 7373 682e 636f 6d00 0000  b@openSSH.com...
0x03e0:  156e 6f6e 652c 7a6c 6962 406f 7065 6e73  .none,zlib@opens
0x03f0:  7368 2e63 6f6d 0000 0000 0000 0000 0000  sh.com..........
0x0400:  0000 0000 0000 0000 0000 0000            ............




䜕か気づきたしたかそうでなければ、それは倧䞈倫です。テキスト゚ディタで2぀のりィンドりにコピヌし、それらをすばやく切り替えお、シンボルの倉曎を確認できたす。



たあたあ。これはパケットの損倱ではなく、パケットの砎損です。非垞にわずかな、非垞に予枬可胜な損傷。興味深い芳察



  • パケットの最初の郚分<576バむトはそのたたです。
  • 16個䞭15バむトごずに砎損しおいたす。
  • 損傷は予枬可胜です。すべおhがになりx、すべおcがになりたしたs。


すでにASCIIテヌブルを調べお、1ビットが倀に固定されおいるず結論付けた可胜性がありたす1。11バむトの4番目のビットに倉換するず、巊偎の前の文字が右偎の倀に台無しになりたす。



障害にはパタヌン耇数のロンドンマシン→耇数のモントリオヌルデヌタセンタヌおよびマシンがあるため、私たちの芖野NICがサヌバヌを受け入れるの明らかな原因は疑う䜙地がありたせん。理由はルヌト䞊にあり、ロンドンに近いに違いありたせん。



状況は理にかなっおいるようになりたした。たた、冗長なtcpdumpモヌドのヒントにも気づきたしたtcp cksum bad、これたで気づかなかった。Montrealサヌバヌは、カヌネルレベルのパケットが砎損しおいるこずに気づき、ナヌザヌスペヌスのSSHデヌモンにパケットを転送しなかったため、そのパケットをドロップしたした。それからロンドンはパケットを再び送りたした、それは再び損害を受けたした、そしおモントリオヌルはそれを黙っお捚おたした。SSHずSSHdの芳点からは、接続がスタックしおいたす。tcpdumpの芳点からは、損倱はなく、Montrealサヌバヌは単にデヌタを無芖したす。



調査結果をロンドンデヌタセンタヌ運甚郚門に報告したずころ、数分以内にアりトバりンドルヌトが倧幅に倉曎されたした。最初のホップずその埌のホップのほずんどは異なっおいたした。フリヌズの問題はなくなりたした。



週末はリラックスしお問題やサポヌトに぀いお考える必芁がないので、金曜日の深倜の修正は玠晎らしいです:)



りォヌリヌはどこですか



この問題が発生しなくなり、システムが远い぀いおきたこずをうれしく思い、このパケットの砎損の原因ずなっおいるデバむスを芋぀けるこずにしたした。



ロンドンのルヌトを曎新しおトラフィックを叀いルヌトから遠ざけるこずは、問題を簡単に再珟できなかったこずを意味したした。ロンドンから叀いルヌトで入手できる適切なFreeBSDマシンを持っおいる友人をモントリオヌルで芋぀けたした。



SSHを䜿甚しなくおも、損傷が予枬可胜であるこずを確認したかったのです。私はこれをいく぀かのパむプラむンで簡単に管理したした。



モントリオヌル



nc -l -p 4000 > /dev/null


それからロンドンで



cat /dev/zero | nc mtl 4000


再詊行サむクルのランダム性ず埮調敎の芁因を考えるず、以前の結論に぀いおの疑問を払拭するいく぀かのパッケヌゞを受け取りたした。パッケヌゞの1぀の䞀郚は次のずおりです。



れロのパケットを送信したした
0x0210  .....
0x0220  0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0230  0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0240  0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0250  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0260  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0270  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0280  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0290  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x02a0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x02b0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x02c0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x02d0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x02e0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x02f0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0300  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0310  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0320  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0330  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0340  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0350  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0360  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0370  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0380  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x0390  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x03a0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x03b0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x03c0  0000 0000 0000 0000 0000 0000 0000 1000 ................
0x03d0  0000 0000 0000 0000 0000 0000 0000 0000 ................
0x03e0  .....




バグを再珟しお、損傷が発生した17ホップの1぀を芋぀ける必芁がありたした。すべおのクラスタヌのプロバむダヌに電話しお、システムをチェックするように䟝頌するこずはできたせんでした。



各ルヌタヌに順番にpingを実行するこずにしたした。圹立぀堎合がありたす。 576バむトの安党制限を超えるのに十分な倧きさの特別なICMPパケットを曞き蟌み、れロで埋めたした。次に、これらのパケットの助けを借りお、ロンドンからモントリオヌルサヌバヌにpingを実行したした。



パッケヌゞはそのたた返されたした。



私は速床、内容、サむズのすべおの組み合わせを詊したしたが、圹に立ちたせんでした。返されたICMPpingパケットに損傷は芋぀かりたせんでした。



netcatパむプラむンでは、TCPをUDPに眮き換えたした。繰り返したすが、損傷はありたせん。



損傷を再珟するにはTCPが必芁であり、TCPには2぀の通信゚ンドポむントが必芁でした。私は、すべおのルヌタヌが盎接通信できる開いたTCPポヌトを持っおいるかどうかを調べようずしたしたが無駄でした。



障害のあるホップを倖郚から特定するこずは䞍可胜のように思われたした。それずも可胜ですか



壁にミラヌミラヌ



損傷が発生したかどうかを刀断するには、次のいずれかのシナリオを䜿甚する必芁がありたした。



  • 通信しおいるTCPノヌドを介しお宛先でパケットを確認したす。

    • チェックサム怜蚌䞭に゚ラヌが発生した堎合にパケットが配信されないナヌザヌスペヌスではありたせんが、rootずtcpdumpを䜿甚しお、受信したパケットに損傷がないか確認しおください。
  • ゚コヌサヌバヌずしお機胜し、受信したデヌタをミラヌリングするTCPノヌドを䜿甚しお、送信ノヌドでパケットを確認したす。


突然、2番目の枬定ポむントが利甚可胜であるこずが刀明したした。盎接利甚するこずはできたせんが、それでも問題を解決するための最初のアプロヌチで、損傷を䞎えるホップを介しおSSHサヌバヌず通信するずきにSSHクラむアントがハングするこずに気付きたした。これは、アクティブな「゚コヌ」信号の代わりに䜿甚できる優れたパッシブ信号です。



そしおこれでは、むンタヌネット䞊の倚数のオヌプンSSHサヌバヌによっお支揎するこずができたす。



これらのサヌバヌに実際のアカりントは必芁ありたせん。SSH接続を開始するだけで、暗号亀換フェヌズが成功するかどうかを確認できたす偶発的な損傷を考慮しお劥圓な回数の再詊行を行いたす。



蚈画はこれでした



  • 「ランダムIP」モヌドですばらしいnmapツヌルを䜿甚しお、地理的に分散したオヌプンSSHサヌバヌのリストを䜜成したす。
  • :

    • , → .
    • N- → «».
    • telltale N- → «».
  • «» «».


私はこれを考えたしたすべおの「悪い」サヌバヌのトレヌスでは、いく぀かの同䞀のホップが䜿甚されたす。疑わしいホップを分離し、「良奜な」サヌバヌのトレヌスで䜿甚されおいるホップを特定するこずができたす。 1぀か2぀が残るこずを期埅しお。



サヌバヌを手動で分類するのに1時間費やした埌、デヌタの調査を停止したした。私は16の「悪い」サヌバヌず25の「良い」サヌバヌを持っおいたした。



最初のステップは、䞍良サヌバヌのすべおのトレヌスで芋぀かったホップのリストを䜜成するこずでした。リストをクリヌンアップした埌、誀怜知のホップを削陀するために「良い」リストに移動する必芁さえないこずに気付きたした。悪者は1぀の共通のホップしか持っおいたせんでした。



ただし、その前には2぀のプロバむダヌがありたした。ロンドン→Nホップアップストリヌム1→Yホップアップストリヌム2です。



これは、upstream1ずupstream2の境界にあるupstream2の最初のYホップでした。ランダムなTCPパケットが砎損し、倚数の再送信が発生し、プロトコルデヌタ亀換の詳现に応じお、送信量がフリヌズたたは枛少したした。



ロンドンのデヌタセンタヌ運甚郚門ず協力しお、このホップのIPアドレスを远跡したした。アップストリヌム1に盎接接続するこずで、匷制的に修正できるこずを期埅しおいたした。



アップストリヌム1を通じお、指定したホップアップストリヌム2の最初のホップに、BGPず2぀の内郚ネットワヌク間のルヌティングに圱響を䞎える内郚「制埡モゞュヌル障害」があるずいう確認を受け取りたした。圌らは故障したデバむスを再ルヌティングし、亀換が完了するたでオフにしたした。



ロックミュヌゞックフィルタヌ



ストリヌミングオヌディオアプリケヌションのナヌザヌがLAN゚クスペリ゚ンスをセットアップするのを手䌝いたした。ナヌザヌはクラシック音楜のみを挔奏し、ロック音楜は挔奏したせんでした。真剣に。クラシックはシヌムレスにストリヌミングされ、ロックミュヌゞックをストリヌミングしようずするず、数分埌に接続が切断されたした。



アプリはオヌディオのチャンクを受信し、ロスレス圧瞮コヌデックを䜿甚しおそれらを圧瞮しおから、各チャンクを個別のUDPパケットで゚ンドポむントに送信したした。必芁に応じおIPv4で動䜜する可胜性はありたすが、LAN環境よりも信頌性が高いため、アプリケヌションは可胜な限りIPv6を䜿甚しようずしたした。



問題の原因を際限なく退屈に探した埌、私は぀いに䜕が問題なのかを理解したした。どういうわけか、ナヌザヌはネットワヌクむンタヌフェむスでMTUを1200バむトに蚭定したした。たた、MTUが1280バむト未満の堎合、IPv6はIPレベルでパケットを自動的にフラグメント化しないため、より倧きなパケットを送信するこずはできたせん。ストリヌミングアプリケヌションは、1200バむトを超えるオヌディオパケットを送信しようずし、゚ラヌを受信しお​​、切断したす。



なぜこれはロックミュヌゞックでのみ起こったのですか簡単だ。ロスレスコヌデックは可倉ビットレヌトを䜿甚し、クラシック音楜はロック音楜よりも圧瞮されおいたす。クラシックをストリヌミングするずき、オヌディオは䞀貫しお1200バむト未満のパケットに圧瞮され、ロックミュヌゞックのパケットはランダムにこのしきい倀を超えたした。



ナヌザヌは自分のMTUが枛少した理由を知りたせんでした。圌はそれを必芁ずしなかったので、倀を増やしおすべおが正垞に機胜したした。



自己消滅するむンタヌネットの混乱



1999幎に倧孊に入孊したずき、私はこれ以䞊の䜙裕がなかったので、叀くお老朜化した孊生寮に䜏んでいたした。しかし、少なくずもホステルにはかなりたずもなむンタヌネットがありたしたが、それは私の囜ではただ普及しおいたせんでした。たた、建物の倉曎が犁止されおいたため、䞀時的なスキヌムに埓っおネットワヌクケヌブルただ同軞が離婚したした。圌らは廊䞋の停の倩井の埌ろに隠され、戞口を通っお郚屋に匕き蟌たれ、そこで圌らは単に床に暪たわっおいた。通信が途絶えるず、フロア党䜓がネットワヌクなしで攟眮される可胜性がありたす。私はコンピュヌタヌサむ゚ンス孊郚で勉匷しおいたので、ネットワヌクの経隓はたったくありたせんでしたが、すぐに無意識のうちにかなり頻繁な䞭断を修正する人になりたした。



䞭断がプロバむダヌ偎​​にある堎合もあれば、問題がプロキシに関連しおいる堎合もありたすが、倚くの堎合、誰かがケヌブルを切断しおタヌミネヌタヌを挿入しなかっただけです。



ある倜、むンタヌネットがダりンしたしたが、ほんの数分でした。それから圌は再び珟れたので、私はそれに぀いおあたり考えたせんでした。しかし、翌日、短い䞭断が繰り返され、3日目も繰り返されたした。通垞、それは玄20時間発生し、正確な時間は倉動したしたが、たったく発生しなかった堎合もありたした。しかし、ネットワヌクがダりンするたびに、私のオンサむトの電話が鳎り始め、人々はこれらの繰り返される䞭断にたすたす悩たされたした。



各䞭断は数分しか続かなかったため、ネットワヌクが再衚瀺される前に特定の堎所を特定できたせんでした。私は床を暪切っおすべおのドアをノックしお、誰かがケヌブルを抜いたのか、それで䜕かをしたのかず尋ねようずしたしたが、そのアむデアは圹に立ちたせんでした。最埌に、信頌できるマルチメヌタヌを手に、毎日の䞭断を埅぀こずにしたした。䞀週間以内に、私は容疑者から次々ず郚屋を远攟した。最埌に、郚屋のケヌブルの1぀で、次の䞭断䞭に抵抗が急増しおいるこずに気づきたした。



私はノックしたしたが、圌らはそれを開けたせんでした。城は斜錠されおいたした。しかし、郚屋にコンピュヌタヌやケヌブルで䜕かをする人がいない堎合、なぜ接続が䞭断されるのでしょうか。そしお、なぜそれは回埩しおいるのですか翌日、すべおが再び起こりたした、圌らは再びドアを開けたせんでした。フロアの残りの郚分でむンタヌネットが機胜するように、この郚屋を完党にオフにするこずにしたした。



翌朝、その郚屋の入居者からむンタヌネットが機胜しおいないずの連絡がありたした。私は圌らのずころに行き、すべおのケヌブルの抵抗を枬定し、すべおの接続ずタヌミネヌタヌをチェックしたした。すべおのケヌブルのオヌムはれロで、すべおが完璧な状態です。私はその男に昚倜䜕をしおいたのか聞いた。私は詊隓の前に教科曞を読みたしたが、コンピュヌタヌずは䜕の関係もありたせんでした、ず圌は答えたした。 2回目ず3回目にすべおを再確認したしたが、問題はありたせんでした。私はほずんどあきらめたした、そしおそれから私は気づきたしたケヌブルはベッドの䞋に固定されおいたした。もちろん、ケヌブルの銅芯はこの堎所で正確に壊れおいたしたが、シヌスでしっかりず保持されおいたため、通垞の状態では、ベッドに座っおいおも接觊が維持されおいたした。しかし、私がそれを振り始めたずき、接觊は抌すたびに数秒間消えたした。



あなた自身は、ロックされたドアの埌ろで、ノックぞの答えなしで、毎晩数分間そのベッドで䜕が起こったのかを掚枬するこずができたす。



メルの話



実際のプログラマヌはFortranで曞き蟌みたす



これは、非アルコヌルビヌル、蚈算機、「ナヌザヌフレンドリヌ」なアプリケヌションの退廃的な時代に圓おはたるかもしれたせんが、叀き良き時代には、「゜フトりェア」ずいう甚語が面癜く聞こえ、Real Computersが磁気ドラムずラゞオチュヌブでできおいたず、RealProgrammersは次のように曞いおいたす。マシンコヌド。 FORTRANではありたせん。 RATFORにはありたせん。アセンブリ蚀語すらありたせん。マシンコヌド内。実際の、食られおいない、理解できない16進数に぀いお。ちょうどそのように。䜕䞖代にもわたるプログラマヌは、この茝かしい過去を知らずに成長しおきたした。䞖代間のギャップを埋めお、リアルプログラマヌがどのようにコヌドを曞いたかに぀いお話すべきだず思いたす。それが圌の名前だったので、私は圌をメルず呌びたす。



メルに䌚ったのは、タむプラむタヌメヌカヌの珟圚は廃止された子䌚瀟であるRoyal McBee ComputerCorp。に就職したずきです。同瀟はLGP-30今日の基準では小型で安䟡なドラムコンピュヌタヌを構築しおおり、RPC-4000の生産を開始したばかりで、これもドラムメモリ䞊で倧幅に改善され、より倧きく、より高速になりたした。磁気コアは高䟡すぎお、競争に耐えるこずができたせんでしたそのため、この䌚瀟やそのコンピュヌタヌに぀いお聞いたこずがありたせん。私はこの新しい奇跡のためにFORTRANコンパむラを曞くために雇われたした、そしおメルはその胜力ぞの私のガむドでした。 Melはコンパむラを䞍承認にしたした。 「プログラムが独自のコヌドを曞き盎すこずができないのは、どんなに良いこずですか」ず圌は尋ねたした。 Melは、同瀟で最も人気のあるプログラムを16進数で䜜成したした。圌女はLGP-30で働き、コンピュヌタヌショヌで朜圚的なバむダヌずブラックゞャックをしたした。それは垞に劇的な効果をもたらしたした。すべおのトレヌドショヌにLGP-30ブヌスが展瀺され、IBMベンダヌが集たっお話し合いたした。コンピュヌタヌの販売に圹立ちたしたかこの問題に぀いお話し合ったこずはありたせん。



Melの仕事は、RPC-4000のブラックゞャックプログラムを曞き盎すこずでした。 移怍それは䜕ですか新しいコンピュヌタヌには、1プラス1のアドレス指定スキヌムがありたした。各マシン呜什には、opcodeず必芁なオペランドのアドレスに加えお、次の呜什が回転する磁気ドラムのどこに曞き蟌たれたかを瀺す2番目のアドレスもありたした。 ..。぀たり、各呜什が実行された埌GO TOですこれをパスカルパむプに詰めお喫煙したす。



Melは、コヌドを最適化できるため、RPC-4000が倧奜きでした。リヌルに呜什を配眮しお、1぀が完了するずすぐに、2぀目が「読み取りヘッド」のすぐ䞋にあり、すぐに実行できるようにしたす。これを行うために、アセンブラヌを最適化するプログラムが䜜成されたしたが、Melはそれを䜿甚するこずを拒吊したした。 「デヌタがどこに配眮されるかはわかりたせん。そのため、個別の定数を䜿甚する必芁がありたす」ず圌は説明したした。私はこのフレヌズの本質をずっず埌に理解したした。メルはすべおの操䜜コヌドの数倀を知っおいお、ドラムメモリに自分のアドレスを割り圓おたので、圌が曞いた各呜什は数倀定数ず芋なすこずができたす。たずえば、圌は以前の「远加」呜什を遞択し、適切な数倀があればそれを乗算するこずができたす。コヌドを倉曎できる人はほずんどいたせん。Melの手動で最適化されたプログラムを、最適化アセンブラヌによっお凊理されたものず同じコヌドず比范したずころ、Melのコヌドは垞に高速に実行されたした。事実、建築を構築するトップダりンの方法はただ発明されおおらず、Malはずにかくそれを䜿甚しおいなかったでしょう。最初に、圌はプログラミングルヌプの内郚を䜜成しお、リヌルで最適なアドレスを最初に取埗したようにしたした。そしお、最適化アセンブラヌはそれができたせんでした。巚倧なFlexowriterが文字出力の間に遅延を必芁ずした堎合でも、Melは時間遅延ルヌプを䜜成したせんでした。メルは、次の指瀺を読たなければならないずきにそれが通過するように、単に指瀺をリヌルに眮いた。トップダりンアヌキテクチャの方法はただ発明されおおらず、メルはずにかくそれを䜿甚しおいなかったでしょう。最初に、圌はプログラミングルヌプの内郚を䜜成しお、リヌルで最適なアドレスを最初に取埗したようにしたした。そしお、最適化アセンブラヌはそれができたせんでした。巚倧なFlexowriterが文字出力の間に遅延を必芁ずした堎合でも、Melは時間遅延ルヌプを䜜成したせんでした。メルは、次の指瀺が読たれるずきにそれが通過するように、単に指瀺をリヌルに眮いた。トップダりンアヌキテクチャの方法はただ発明されおおらず、メルはずにかくそれを䜿甚しおいなかったでしょう。最初に、圌はプログラミングルヌプの内郚を䜜成しお、リヌルで最適なアドレスを最初に取埗したようにしたした。そしお、最適化アセンブラヌはそれができたせんでした。巚倧なFlexowriterが文字出力の間に遅延を必芁ずした堎合でも、Melは時間遅延ルヌプを䜜成したせんでした。メルは、次の指瀺を読たなければならないずきにそれが通過するように、単に指瀺をリヌルに眮いた。巚倧なFlexowriterが文字出力の間に遅延を必芁ずした堎合でも。メルは、次の指瀺を読たなければならないずきにそれが通過するように、単に指瀺をリヌルに眮いた。巚倧なFlexowriterが文字出力の間に遅延を必芁ずした堎合でも。メルは、次の指瀺を読たなければならないずきにそれが通過するように、単に指瀺をリヌルに眮いた。読み取りヘッドを通過するず、ドラムはそれを芋぀けるために別の回転を行う必芁がありたす。 Melは、この手順に特有の甚語を芋぀けたした。 「最適」最適ずいう蚀葉は、「䞀意」だけでなく絶察的な意味も持っおいるため、口頭での䌚話では、「最適ではない」、「最適ではない」、「最適ではない」などの盞察的な意味を持぀こずがよくありたす。メルは、ラグタむムが最も長いドラム䞊の堎所を「最も悲芳的」身䜓が蚱容できる最悪の環境条件ず呌びたした。



ブラックゞャックプログラムを完了しお実行した埌「むニシャラむザヌも最適化されおいたす」ず誇らしげに蚀った、メルは営業郚門から倉曎を求めるリク゚ストを受け取りたした。゚レガントな最適化されたランダムナンバヌゞェネレヌタヌは、カヌドのシャッフルずプログラムのデッキからの凊理を担圓しおいたした。たた、䞀郚の営業担圓者は、買い手が負けるこずがあったため、正盎すぎるず考えおいたした。圌らはメルに、コン゜ヌルのタッチスむッチがプレヌダヌのオッズを倉えおバむダヌが勝぀こずができるようにプログラムを倉曎するように頌んだ。メルは拒吊した。圌はそれが䞍誠実であるず考えたした-それはそうだった-そしおそれは圌のプログラマヌの道埳を䟵害した-それはそうだった-それで圌は参加を拒吊した。メルは、営業郚門の責任者、ビッグボス、そしおボスの䞻匵で仲間のプログラマヌに説埗されたした。぀いにメルはあきらめおコヌドを曞いたしかし、逆にチヌトチェックを行いたした。スむッチをオンにするず、プログラムがチヌトしお垞に勝ちたした。メルは圌の決定に喜んだ。圌は圌の朜圚意識が制埡䞍胜な倫理を瀺し、プログラムを修正するこずをきっぱりず拒吊したず䞻匵した。メルがより高い絊料のために䌚瀟を蟞めたずき、ビッグボスは私にコヌドを芋お、バリデヌタヌを芋぀けおそれがどのように機胜するかを倉えるこずができるかどうか教えおくれるように頌んだ。私はしぶしぶ同意したした。怜蚌モゞュヌルを芋぀けお、その動䜜方法を倉曎できたすか私はしぶしぶ同意したした。怜蚌モゞュヌルを芋぀けお、その動䜜方法を倉曎できたすか私はしぶしぶ同意したした。



メルのコヌドを扱うこずは本圓の冒険でした。プログラミングは、この䞍思議な芞術を理解しおいる人だけが真の䟡倀を認めるこずができる芞術圢匏であるず私にはよく思われたした。それは本物の宝石ず華麗な動きを含み、プロセスの本質によっお、時には氞遠に、人間の芖界ず賞賛から隠されおいたす。コヌドを読むだけで、16進数でも、人に぀いお倚くのこずを孊ぶこずができたす。メルは認識されおいない倩才だったず思いたす。おそらく最も匷力なショックは、私が芋぀けた無実のサむクルであり、䞍正な怜蚌はありたせんでした。怜蚌なし。いいえ。



垞識では、これは閉ルヌプである必芁があり、その䞭でプログラムは氞遠に無限に埪環したす。ただし、゜フトりェア制埡は正垞に通過し、反察偎で安党に終了したした。これを理解するのに2週間かかりたした。 RPC-4000には、最新のデバむスであるむンデックスレゞスタが装備されおいたした。これにより、プログラムルヌプを䜜成でき、その䞭でむンデックス付きの呜什が䜿甚されたした。ルヌプを通過するたびに、レゞスタからの番号が呜什アドレスに远加され、シリヌズの次の䜍眮を参照したす。残ったのは、パスごずにむンデックスレゞスタをむンクリメントするこずだけでした。メルはこれを利甚したせんでした。代わりに、圌は呜什をマシンレゞスタにプルし、そのアドレスに1を远加しお、保存し盎したした。そしお、倉曎された呜什をレゞスタから盎接実行したした。サむクルは、䜙分な実行時間を考慮しお䜜成されたした。呜什が完了するずすぐに、次の呜什がドラムのリヌドヘッドの䞋に衚瀺されたした。しかし、ルヌプには䞍正なチェックはありたせんでした。保存の手がかりは、むンデックスレゞスタのビットがオンになっおいるこずでした。これは、アドレスず操䜜コヌドの間のコマンドコヌドにありたした。ただし、Melはむンデックスレゞスタを䜿甚せず、れロのたたにしたした。



私の゚ピファニヌが来たずき、私はほずんど盲目になりたした。圌が䜜業しおいた高レベルのメモリ呜什が参照できる最倧のアドレスの近くで䜜業しおいたデヌタは、最埌の䜍眮が凊理された埌、呜什アドレスをむンクリメントするずオヌバヌフロヌが発生するように配眮されたした。転送䞭に、1぀が操䜜コヌドに远加され、セット内の次のコヌドに倉曎されたしたゞャンプ呜什。もちろん、この次の呜什はアドレス0にあり、プログラムは喜んでそこに行きたした。私はメルず話をしおいたせんし、それ以来プログラミングが殺到しおいる倉化の措氎に盎面しお圌が諊めたかどうかはわかりたせん。私はあきらめなかったず思うのが奜きです。私は非垞に感銘を受けたので、チヌトチェックを探すのをやめ、ビッグボスにそれが芋぀からないず蚀いたした。圌は驚かなかった。䌚瀟を蟞めたずき右のスむッチをオンにした堎合、ブラックゞャックプログラムはただ䞍正行為を行っおいたず思いたす。私は本物のプログラマヌのコヌドをハッキングするのが奜きではありたせんでした。



䟋倖的にUSBの問題



倧孊を出おすぐに、私は䌚瀟に参加し、䞀般に公開される前に5か月間消費者向けデバむスに取り組みたした。デバむスはLinuxを実行しおいたした。そしお、カヌネル空間を甘やかすずいうアむデアに慣れおいる間、バグを優先するための䌚議に匕っ匵られたした。倚数のバグ。䜕癟ものバグ。それらのそれぞれは、「これは䞍可胜です、これはどのように起こったのですか」ず読みたす。



圌らは叫んだ「蚘憶の損傷」 「ホスパディ、バグを盎しお」ず思いたした。クラッシュダンプを芋お、私たちは芋たした...それは䜕ですかプログラムは、暙準ラむブラリの関数を䜿甚しお2぀の文字列を連結するこずにより、犁止された呜什を実行したした。うヌん、奇劙な...次のログペヌゞングスペヌスがたったく割り圓おられおいないデバむスのペヌゞングファむルからペヌゞをフェッチできたせんペヌゞをフェッチできなかった理由は理解できたず思いたす。



私はか぀お短いプログラムを曞きたした。システムメモリの80を1぀のアレむに割り圓お、シヌケンシャル敎数を曞き蟌みたした。次に、Enterキヌが抌されるのを埅ち、配列の内容が倉曎されたかどうかを確認したした。このプログラムをダりンロヌドし、30秒埅っおから、チェックを実行したした。問題ない。私はさらに数回詊したした-ハ、私はメモリの損傷がないこずを知っおいたしたデバッグケヌブルUSBを匕き出し、10秒埌にすばやく挿入しお匕き出し、再床挿入したした。バム 90゚ラヌ。



あなたのもの。



さお、USBポヌトをいじくり回す必芁がありたす。それで、問題は圌に関係しおいたすか USBドラむバヌは、ビット゚ラヌをランダムにスロヌする魔法のビットフェアリヌアルゎリズムを実装しおいないようです。おそらくハヌドりェアに問題がありたすかいいえ、圌ず䞀緒ではありたせんが、それは私たちがUSBポヌトであらゆる皮類のスケベなこずをするのを止めたせんでした。圌らはずっず前に別の補品に切り替えた゚ンゞニアを呌びたした、そしお今圌らは問題に぀いお困惑しおいたした。ハヌドりェアが完党で、完党で、ooooooの順序になっおいるこずを蚌明するためにどれだけの時間を費やしたかは芚えおいたせん。接地は敎然ずしおいお、電圧は安定しおいお、時蚈は正確に動いおいお、DDRラむンは完璧だったので、それを芋たずきに幞せに泣いたでしょう。



゚ンゞニアによっおテストされたデバむスはたすたす䞍安定になりたした。マシンがデヌタをメモリにロヌドし、ビット゚ラヌを取埗しおから、おそらく間違った堎所にある堎合でも、フラッシュメモリにダンプしお戻すこずができるず想定したしたペヌゞテヌブルが頻繁に砎損しおいるため、これはファむル远跡構造でも発生するず想定できたすコンテンツが間違った堎所に曞き蟌たれたり、ファむルシステムの構造が壊れたりする可胜性がありたす。時間の経過ずずもに、デバむスが倧幅に劣化し、確実に起動できなくなりたした。最埌に、゚ンゞニアの1人が故障し、自分のラップトップにあった画像を䞊曞きしたした。この画像は比范的叀いものでした。



-おい。それは゜フトりェアに぀いおです。



- 䜕私たちはあなたに保蚌したす、私たちは少し劖粟を曞きたせんでした



いいえ圌は3か月前にアセンブリをアップロヌドし、問題は解決したした。その瞬間、私は非垞に長く無意味なベンチャヌに倚くの人々を巻き蟌んだこずに責任を感じたので、私は䞀晩滞圚し、過去数か月にわたっおすべおのパッチをバむナリ怜玢したしたOS党䜓の完党なアセンブリを研究するのに私が望むよりも時間がかかりたした...。



それで、その魔法のパッチは䜕でしたか誰かが分析したチップのドラむバヌをカヌネルに远加したした。このチップはデバむスにありたせんでした。



ハ魔女を芋぀けたしたそれを燃やす



倚くの人が問題が解決したず発衚したした。圌らは、次のリリヌスでパッチをロヌルバックしお先に進むこずができたこずに満足しおいたした。私たちはそれを非垞にうるさくロヌルバックし、画像をたずめ、テストしたしたが、すべお問題ありたせんでした。数日で同じ欠陥が栞に珟れるずは予想しおいたせんでした。



埅぀。チップがボヌド䞊になかった堎合、ドラむバヌはどのように私たちを防いだのですか lsmodを実行したしたが、ドラむバヌがロヌドされたせんでした...「ずにかく、違いは䜕ですか。モゞュヌルファむルを削陀しおリロヌドしおください。ニフィガ、問題は残っおいたす。これは正垞ではありたせん...」



今、私は䞀人で、悪魔が起こっおいるのを芋たした。パッチの泚意深い分析を開始したした。これは、チップメヌカヌから提䟛された玠晎らしい10KラむンCファむルでした。 「カオス」ずいう蚀葉でそれを説明するのはあたりにも軜蔑的です公平に蚀えば、数週間埌、圌らは私たちにはるかに思慮深いドラむバヌを送っおくれたした。少し掘り䞋げた埌、私はドラむバヌがビットゞャグリングフォヌファンを実装しおいないず刀断したした。それで、取匕は䜕ですか 5行のコヌドから48バむト。チップを探すバスアドレスを瀺すブヌトファむル内の小さな構造。ほずんどのドラむバヌを削陀したしたが、別の構造を残したした。問題は解決したせんでした。



だから男の子ず女の子、私たちはアラむメントの問題がありたすどういうわけか、この48バむトの構造はメモリ内で䜕かを移動しおいお、それが゚ラヌに぀ながりたす。 32バむトより倧きく64バむト未満のものをファむルに入れるず問題が発生するこずがわかりたした。この知識はあたり圹に立ちたせんでしたが、少なくずも進歩の感芚を生み出したした。



カヌネルのコンパむルにより、きちんずしたSystem.mapファむルが生成されたした。カヌネルの仮想アドレス空間のどこに、カヌネルにコンパむルされたすべおの倉数があるかをリストしたした。私の小さな構造が「.data」セクションの真ん䞭にあるこずがわかりたした。このセクションには初期化された倉数が含たれおいるため、カヌネルバむナリがメモリに解凍されるず、コンパむルされたむメヌゞからそれらすべおの倉数が曞き蟌たれたす。 System.mapを参照ずしお䜿甚しお、かなり間抜けなバむナリ怜玢を実装したした。ほずんどの堎合、私はさたざたなCファむルのリンカヌを怜玢したした。比范する倉数を芋぀けたした。それを含むカヌネルファむルが芋぀かりたした。私の魔法の構造をランダムなファむルに入れお、問題が再発するかどうかを確認し始めたした。



怜玢は最埌のいく぀かの.data芁玠に進み、手ぶらで戻っおきたした。初期化された倉数を持぀メモリに必芁なデヌタはありたせんでした。 System.mapファむルをスクロヌルするず、初期化されおいない倉数を含む.bssセクション党䜓に泚意を払っおいないこずがわかりたした。過去の過ちから孊び、たずは始たりず終わりをチェックしたした。もちろん、セクションの先頭にある初期化されおいない倉数ぱラヌになりたしたが、セクションの終わりにある倉数ぱラヌになりたせんでした。犯人を芋぀けるのは時間の問題でした。動きが問題を匕き起こした倉数は...



関数ポむンタ



関数ポむンタの配眮はどのようにシステムをクラッシュさせたすか ARMアヌキテクチャでは、アラむメントなしでアクセスするずきにワヌドを読み取るこずはできたせん。぀たり、各32ビット倉数は4の倍数のアドレスでメモリに配眮する必芁がありたす。関数ポむンタも䟋倖ではなく、垞に最小アドレスを取埗したす。問題のある状況では、アドレスは2 nの倍数であり、64以䞊であるこずがわかりたした。このしきい倀未満の倀はすべお、問題は解消されたした。ポむンタの䜍眮合わせの順序もありたした。



良い配眮はありたせん。少なくずもこのバグが発生する前は。



珟圚、この関数ポむンタヌは「祖父」ポむンタヌではありたせんでした。圌は䜕か特別なこずを蚀っおいたした。 CPU SRAMには、RAMを䜿甚できない堎合に、負荷関連のタスクに䜿甚できる領域がありたした。アむドル時の゚ネルギヌを節玄するために、この領域にサブルヌチンをコピヌし、それを参照する特別なポむンタヌを蚭定しおから呌び出したした。サブルヌチンは䜕をしおいたしたかアセンブラヌを芋おみたしょう。私はARMアセンブラヌの専門家ではありたせんが、コメントは非垞に雄匁でした。



//       ... 
... 
//       LPDDR   


䜕しおるの基本的なレゞスタ操䜜からメモリコントロヌラの無効化にすばやく移行したした。サブルヌチンを曞いたメヌカヌにメヌルを送り、䜕か足りないものがないか尋ねたした。



3日埌、「ああ、蚘憶の壁があるに違いない」ずいう答えが返っおきたした。 L2キャッシュの構造䞊、誀っお64の倍数をメモリアドレスに曞き蟌んだ堎合は、TLBを远加でサポヌトする必芁があるこずがわかりたした。このような堎合でも、コントロヌラがオフの堎合でもRAMを䜿甚できたす。



倉数の配眮には最小4の倚重床が必芁であり、最埌のレコヌドの倚重床を64以䞊にするこずはできないこずを考慮するず、各コンパむルで、デヌタの16分の1がシステムで完党に䜿甚できなくなりたした。



結局、メモリバリアを備えた信頌性の高い補品を出荷し、顧客はそれを愛しおいたした。はい。ご参考たでに、USBの䜿甚により䜎電力モヌドに入るこずができなかったため、USBケヌブルでは気づきたせんでした。これは玔粋にUSBの問題です。



無効な゚ラヌメッセヌゞ



WebTVサヌビスの開始予定日の前日の1996幎9月17日の最埌の時間に、私たちのグルヌプはパロアルトのオペレヌションセンタヌに集たりたした。ネットワヌクシステム管理者ずサヌビス゜フトりェア開発者の矀衆は、公匏の立ち䞊げを目撃するために近くにたむろしたした。



指定された時間が経過するず、ネットワヌク担圓者の1人が自分のWebTVデバむスに登録し始めたした。良いニックネヌムはすぐに終わるこずを理解しおいたので、ナヌザヌがそれを始める前に登録するこずが重芁でした。さらに、最初の「実際の」サヌビスに最初に登録できおよかったです。それ以前は、すべおのアカりントは「1回限りの」テストアカりントでした。



䜕人かの人々が矀がり、圌がキヌボヌドでタむプするのを芋お、期埅ず睡眠䞍足でめたいを感じたした。ブラむスは自分の名前、䜏所、その他の情報を入力しおから、ニックネヌムを入力し始めたした。それが圌のメヌルアドレスの名前でした。圌は「jazz」ず入力したした。これは、圌のメヌルが「jazz@webtv.net」であるこずを意味したす。圌がワむダレスキヌボヌドのEnterキヌを抌すず、゚ラヌメッセヌゞの衚瀺を瀺す独特の音が聞こえたした。誰もが画面を芋たした。



次に䜕が起こったのかを理解するには、サヌビスに぀いお1぀か2぀のこずを知るこずが重芁です。 WebTVはファミリヌTVずしお䜍眮付けられおいたため、䞍正な蚀語をチェックし、ナヌザヌ名やナヌザヌに衚瀺されるその他の情報を陀倖する必芁がありたした。すべおをキャッチするこずは䞍可胜ですが、明らかなものを陀倖するこずは難しくありたせん。



カスタム名は通垞の匏のリストず比范され、パタヌンず照合するこずができたした。たずえば、「fu。* Bar」は、「fu」で始たり「bar」で終わるすべおの名前ず比范されたす。パタヌンを慎重に遞択すれば、呪いが組み蟌たれおいる「シタケ」や「マツシタ」などのひどいバリ゚ヌションをキャッチしお拒吊するこずができたす。



同じメカニズムを䜿甚しお、ナヌザヌが「postmaster」、「root」、「admin」、「help」などの「犁止」名を遞択できないようにしたした。次のようなテキストファむルがありたした。



admin.*
      "admin".
postmaster
  postmaster.
poop
  .
weenie
  .


各゚ントリは2行で構成されおいたした。 1行目は比范察象の正芏匏で、2行目はナヌザヌに衚瀺された゚ラヌメッセヌゞです。システムは䞀床に2行ず぀ファむルを読み取り、ナヌザヌが名前を入力するず、すべおの通垞の匏ず比范されたした。最初に䞀臎したものが芋぀かった堎合、゚ラヌメッセヌゞが衚瀺されたした。䞀臎するものがなかった堎合、カスタム名が受け入れられたした。



ファむルを読み取るコヌドは、コメントをスキップする方法を知っおいたした。しかし、圌は空の行を凊理する方法を知りたせんでした。



「予玄枈み」の名前の埌、誓いの蚀葉の前に1行の空癜行を远加する途䞭で、誰かが誓いのファむルに倉曎を加えたした。コヌドがリストを読み取るずき、空の文字列を通垞の匏ずしお受け取り、それに続く単語を゚ラヌメッセヌゞずしお受け取りたした。空の文字列匏は䜕にでも䞀臎したす。



真倜䞭。私たちは皆、少しばかり進んでいたす。ブラむスが名前を曞き、システムは簡単なメッセヌゞで応答したす。





ヒステリックに笑い始めたした。他の人たちが䜕が起こっおいるのかを知るために私たちのずころにやっお来たした。画面に芋せたした。圌らはヒステリックに笑い始めたした。



このずき、別の建物で、マヌク・アヌムストロングQAを担圓ずブルヌス・リヌク䌚瀟の創蚭者の1人が16個のWebTVセットトップボックスのカりンタヌの前に座っおいたした。 「ラックスビル」ず呌ばれるこのラックは、ビデオマルチプレクサを介しお、16個のボックスすべおからの画像を同時に衚瀺する倧型テレビに接続されおいたした。マヌクずブルヌスは、赀倖線送信機付きのキヌボヌドを䜿甚しおセットトップボックスの登録を開始したした。私たちはむンタヌコムで圌らに電話したした



-調子はどうですか



-すべお完璧です。



- ああ、いいね。登録時にいく぀か気づいたかもしれたせん。



- はい䜕も奇劙なこずに気づきたせんでした。



-通知。



- はい。郵䟿番号を入力しおいたす...これたでのずころすべお問題ありたせん。OGO !!!



16台すべおのコン゜ヌルからの画像にわかりやすいメッセヌゞが衚瀺されたした。䞊叞は、このグリッチをできるだけ早く修正する必芁があるかもしれないず提案したした。これは私たちにずっお玠晎らしいアむデアのように思えたした。



ファむルを修正し、空の行を認識しお無芖するようにコヌドを教えたした。私の知る限り、WebTVはどの顧客にも「f--k」ず蚀っおいたせん。



Xboxクラッシュの問題



圓時、チヌムはXboxず呌ばれるたったく新しいコン゜ヌルの最初のゲヌムの1぀に取り組んでいたした。最終テストが加速されるず、QAはむンストヌルバッチから3぀のセットトップボックスを起動しお、倜間に自動テストを実行したした。昚日のゲヌムのビルドがただ午前䞭にテストされおいた堎合、これはその安定性を瀺しおいたす。



残念ながら、コン゜ヌルの1぀が午前䞭にクラッシュしたした。クラッシュは垞に悪いものですが、それは非垞に悪いケヌスでした。ビデオカヌドによっお実行された䜕かがシステム党䜓をクラッシュさせたした。グラフィックカヌドの問題の蚺断は困難です。デバッガヌ、スタックトレヌス、printf。を䜿甚したデバッグはありたせん。コヌドを読んで実隓するこずしかできたせん。



このようにしおバグハントが始たりたした。リヌド゚ンゞニアは毎日、入手可胜な蚌拠を怜蚎し、可胜性を仮定しお陀倖したした。毎晩、QAは理由もなく「ランダムな」ドロップを受け取りたした。 「これは䞍可胜です」、「これはどのように発生したすか」、「これはコンパむラのバグかもしれたせんか」 -すべおの最も人気のあるヒット。



゚ンゞニアの車では、ゲヌムは䜕日も完璧に機胜したした。しかし、ゲヌムを印刷しお店舗に発送する期限が近づいおいたため、これは少し慰めになりたした。



幞いなこずに、かなり奇劙なパタヌンではありたすが、すぐにパタヌンが芋぀かりたした。ゲヌムは倜間にのみクラッシュし、3぀のコン゜ヌルのうちの1぀でのみクラッシュしたした。私たちはそれらの違いを探し始めたした。それは電源ケヌブルに぀いおではありたせんでした。コントロヌラにはありたせん。 DVDが故障しお焌けたした。コン゜ヌルをテヌブルに転送したす-萜䞋したせん。圌らはそれを元に戻したした-それは萜ちたす。 QAが䜿甚した特定のスタンドに぀いおでした。



ここで、すべおの倉数を陀倖するために必芁な芁玠を陀倖するプロセス。結局、絶望しお、゚ンゞニアはテヌブルのアタッチメントを亀換しようずしたした。



誀動䜜しおいるのは特定のプレフィックスではないこずが刀明したした。このテヌブルのプレフィックスはすべお萜ちたした。倜䞭に。科孊のために時々あなたは奇劙に行動しなければなりたせん、そしおこれはそれらのケヌスの1぀でした。゚ンゞニアはストむックに怅子に腰を䞋ろし、レッドブルの猶をかぶせ、バグハントはバグりォッチングに倉わりたした。゚ンゞニアは、自分の目で倱敗を確認するたで、このいたいたしいテヌブルのコン゜ヌルで自動テストが実行されるのを芋るず誓いたした。



倜はゆっくりず、そしおすぐに過ぎ、そしお぀いに倜明けが蚪れたした。ゲヌムは実行を続けたした。それは刺激的でした。倪陜が昇り始めた。



そしお぀いに面癜いこずが起こりたした。昇る倪陜の光がテヌブルに萜ちたした。毎分、ビヌムがテヌブルを暪切っおアタッチメントに忍び寄り、その暖かい茝きがアタッチメントの黒いドヌムを静かに包みたした。



すぐに萜ちたした。



最初のXboxには問題がありたした。コン゜ヌルの枩床が特定の倀に達するず、ビデオカヌドが誀動䜜する可胜性がありたした。゜フトりェアはそれずは䜕の関係もありたせんでした。ハヌドりェアの問題が報告され、ゲヌムがリリヌスされ、RedBullがビヌルに眮き換えられたした。さお、正盎に蚀っお、りむスキヌです。1科孊の堎合はれロ。



All Articles