仲間のプログラマーが最悪のプログラミング手法を使用した


37

言うのは奇妙に思えますが、職場の仲間のプログラマーは故意にいくつかの悪いプログラミング慣行を意図的に使用しました!説明します。まず、彼は知的な男であり、ほとんどの場合、彼はわかりやすいコードを書いていると言いましょう。

彼は、Javaで書かれたWebアプリケーションプロジェクトにライセンスを実装するよう求められました。Javaなので、本当に必要な場合は、おそらくjarファイルをハックして、内部に記述されたクラスとメソッドの名前を読み取ることができます。この問題に対する彼の解決策は、文字通り、新しいクラスを生成するのではなく、変数とメソッドをわかりにくい名前で不自然に呼び出し、すでに混雑しているクラス内にそれらを植え付けることでした。

彼の正当化は、ハッカーがライセンスチェックをバイパスするために特定のクラスを切り替えたい(したがって、製品の無料コピーを取得したい)場合、どの方法が明らかでない場合、それははるかに困難な時間になるだろうということでしたこれらの特定のタスクを実行します。彼がそれを行って初めて、私は彼に立ち向かったので、良いプログラミングの実践を維持しながら、何らかの難読化ライブラリを購入してそれを行うことができるかもしれないと示唆しました。彼は、その種のソリューションを検索する時間やリソースがなかったと主張しています。

..私はジレンマに陥ります。Javaで難読化ライブラリを探して、彼の古いコードを修正します(彼のコードを改造するのは少し面倒かもしれません)か、それをそのままにしておきますか?


4
あなたの質問がこの状況の政治をどのように扱うかに関するものである場合、ここでの回答の多くは正しい方向を指しているが、あなたのコメントが示唆するように、提案するより良い代替案が本当に欲しいなら、あなたはチェックしたいかもしれないこの質問への回答アウト:stackoverflow.com/questions/6018215/...
マーク・ブース

8
クリーンソースコードにアクセスできるハッカーが認証をハッキングできる場合、それはハッキング可能な期間です。難読化の量は役に立ちません。一部のハッカーを阻止するソリューションを求めている場合は、難読化に加えて、彼の誤った方向付けのプラクティスを使用することもできます(簡単に置き換えられない可能性の低いクラスにあるものを隠します)。認証方法を完全に変更する頻繁な更新も役立ちます。多くのユーザーは、ハッカーに頼るのにうんざりして、それを買うだけです。
ビルK

2
彼は地元の人々の名前を変更しましたか?もしそうなら、彼は時間を無駄にしている-とにかくコンパイルされたコードに名前付き変数として存在しない。
ニックジョンソン

1
それは「難読化」と呼ばれ、最近ではより頻繁に使用されていますが、完全な証拠ではありません!オブジェクトコードを暗号化し、正しいキーでのみ実行できるため、ディスクエディター、逆アセンブラー、またはその他のクラッキングツールを使用していても、頭や尻尾を作ることはできません。
フランクR.

6
「この問題に対する彼の解決策は、文字通り、新しいクラスを生成するのではなく、変数とメソッドをわかりにくい名前で不自然に呼び出し、既に混雑しているクラス内に植え付けることでした。」そして、「最初に彼が知的な男だと言わせて」と同じ段落ではうまくいきません!
20:51にエリジウムをむさぼり食った

回答:


94

難読化によるセキュリティは、決して優れたセキュリティではありません。あなたの知的財産を保護するより良い方法がなければなりません。そして、それはあなたとあなたの同僚があなたの上司との共同懸念として提起すべきものです。その後、経営陣がセキュリティの向上に時間やお金を費やしたくないと判断した場合、あなたとあなたの両方がその決定に沿って生きなければなりません(あなたの製品ではなく、会社の製品です)。これ以上の時間。


31
+1難読化はセキュリティではなく、単なる快適な毛布です。
uɐɪ

7
難読化よりも優れたソリューションを思い付くことができる場合は、正しい答えとしてマークを付けます。warファイルにアクセスできる人が、少なくともライセンスに関する懸念のためにその機能を変更できないことをどのように保証できますか?
ニール

5
誰かがファイルにアクセスした場合、それを保証することはできません。しかし、真実は次のとおりです。最も単純なメカニズムは、ユーザーの99,99%がソフトウェアに損害を与えることを防ぎます。献身的で熟練したハッカーは、常にアプリケーションのセキュリティを回避する方法を見つけます。ただし、リモート検証に切り替えることができるため、プログラムは、自分のサービスに対して認証された場合にのみ実行されます。それを安全にするには、プログラム全体を暗号化し、ある種のブートローダーを用意する必要があります。しかし、誰かが有効なキーを持っている場合、とにかくソフトウェアを再びリバースエンジニアリングできます。
ファルコン

7
@Neil:USBドングルとして接続されたマイクロコントローラーにコアビジネスロジックを実装します。あなたは、それが安価であるか、実装が簡単でなければならないとは言わなかった;)
SF。

8
@SF .:タッチ。地獄のために、同時にリンクするためにも3つの衛星が必要だと思います。;)
ニール

84

オリジナル:上司は何と言っていますか?調べる-それを行います。


上記について詳しく説明するように依頼されました。

まず、ジレンマは複数あると思います。

  • 他の人のコードを「修正」する必要がありますか?
  • 他の人の実装(ここからA)は、他の人に置き換えられるほど十分に悪いですか?
  • この「アプリケーションにライセンスを埋め込む」には、難読化ツール(ここからB)が適していますか?

まず、問題はビジネスケースから見IS解決しました。Aは適切な場所にあり、ほとんどの場合、問題の「十分な」解決策です。あなたの会社は、基本的にそれを破壊するために意図的な努力が必要であるだけで十分に保護されていることに満足しているかもしれません。

これは、たとえあなたがそれを嫌っていても(そして、私を信じて、あなたのキャリアを通してずっと悪いことに気付くでしょう)、それが必要なことをすることを意味します。したがって、問題が解決されると、「ただそれを行う」のではなく、むしろあなたの仕事を担当する担当者に長期的に納得させるべきです。この実装の価格は、ロールバックと在庫難読化ツールの選択を保証するのに十分な高さになります。これには、かなりの準備が必要です。また、難読化ツールには、知っておく必要のある欠点もあることに注意してください(他の答えもこれに当てはまります)。たとえば、スタックトレースはすぐに使用できるわけではありません。すべては、著作権侵害を回避することがどれだけ重要かによって異なります。最も壊れにくいのは、ハードウェアドングルの実行が必要なものであり、顧客が望むよりも高価である可能性が高いことに注意してください。

したがって、あなたの会社はBに行くために追加のリソースを使用する必要があるため、この決定はあなたの意思ではありません。したがって、責任者に懸念を伝え、これと他の長期的な懸念を十分に説明して彼が理由を理解する必要がありますあなたはそれがあなたの提案に劣ると考えます。その後、彼に決定を下させ、結果がどうなるかに関係なく、それを尊重し、それに応じて専門家として振る舞います。オリジナルの作者は、おそらくそれを書いたときとにかくそれを維持しなければならないことに注意してください。もし彼がそれを去るか、それを望まないなら、あなたは問題を再び持ち出すことができます。

言い換えれば、あなたの上司は何と言っていますか?調べる-それを行います。

また、Aの実装に費やした時間の無駄遣いが少なくなるように、以前に問題を提起していた場合、これは異なっていたことに注意してください。言い換えれば、AとBの間の選択が行われることになったとき。

最後に、「他の人のコードを修正する」というあなたの質問にコメントしたいと思います。これは、既存のコードに対する小さな修正ではありません(特にテストが実施されている場合は、これが問題なく推奨されます)。これは破壊的なロールバックと再実装であり、コードの所有権が共通のチームであっても、事前の承認なしでは、少なくとも私にとってはこれは受け入れられないことです。

うまくいけば、これが私の見方を明確にする。


8
私の上司はプログラマーではないので、おそらくプログラムの動作を最終的には変更しないようなことをするために時間とお金を費やすべき理由を説明するのに苦労するでしょう。
ニール

15
@ニール:...それでは、多分それはあなたの上司に「メンテナンス費用」の概念を紹介する時ですか?
SF。

21
これは、同僚や職場環境に関するすべての質問に対するデフォルトの回答になりますか?これを答えとして投稿するように言わなければならないことがありますが、それ答えではありません。これは、実際には、あいまいさによるセキュリティの問題についての、まともな(しかし厄介な言葉ですが)質問です。この「答え」はin辱的です。
アーロンノート

8
@Aaronaught。「実装Aが悪い。実装Bを行うことをお勧めします」と答えると、追加の作業(お金と同等)を行う必要があるため、骨が折れます。AとBのどちらを実装するかを選択した場合、答えは異なります。より詳細な回答が必要な場合は、メタに関する質問を開くことをお勧めします。

22
「これは同僚や職場環境に関するあらゆる質問に対するデフォルトの回答になるのでしょうか?」何故なの?これが技術的な質問として表現された場合、たとえば「自動難読化vの手作業によるコード化(=悪い練習)難読化の方が良い」という場合はまったく別の質問であり、技術的な議論が必要です。すべて「同僚の後ろでこれを修正する必要がありますか?」質問は最終的に「いいえ、チーム/ハイパワーの注意を引く」に
要約されます

13

Javaで難読化ライブラリを探して、彼の古いコードを修正します(彼のコードを改造するのは少し面倒かもしれません)か、それをそのままにしておきますか?

いいえ、誰かの後ろに戻って、彼らが担当するコードを変更することは、最初に疑わしいコードを書くよりも悪い犯罪になるでしょう。

プログラマーと一緒に持ち出しました。次のステップは、鼻を出さないようにするか、管理者と一緒に持ち出し、鼻を出さないようにすることです。


その後、将来これらのクラスを釣るときは、鼻をかざすだけです。
ニール

3
そのコードに対して直接的な責任がある場合、好みに合わせて変更することは問題ありませんが、共同責任がある場合は、仲裁人が必要になります。仕事上の関係を傷つけたり、このような状況で時間を無駄にしたりすることは簡単です。できれば問題を起こさないほうがいいでしょう。問題を作成する必要がある場合は、できるだけ早く問題を解決してください。
DKnight

6

あらゆる種類の公式のコードレビューがありましたか?あるいは、あなたが非公式の「コードレビュー」を受けた対立がありましたか?これはセキュリティやライセンスなどのデリケートで重要なテーマであるため、これを連鎖的に引き上げる必要があると思います。最初の部分、つまりプログラマーとの対決を完了しました。しかし、彼が聞いていないので、あなたはそれを取り上げることができます/すべきです。そうでない場合は、問題の一部である可能性があります。

私は彼にあなたがそれをやろうとしていると言います-これは彼の心を変えるかもしれません。そうでない場合は、状況について非常に政治的に正しいが、正確で簡潔なメールを上司に書き、プログラマーにCCします。電子メールで、3人または他の参加者の間でミーティングを依頼します。

常にこれらのことを真正面から満たしてください。しかも政治的で友好的な方法で。


確かに称賛に値するアプローチ。自分でコードを修正し、SVNからコードを更新していることに気付きました。可能性はありますが、彼が同意しない場合、プログラマがすでに「機能している」と主張する可能性があるため、上司にこれらのセキュリティ予防措置を講じるよう説得しても、変化は生じません。
ニール

2

クラスのシグネチャ(メソッド名など)を難読化できる難読化ツールを見つけられる場合は、それを購入して使用することを提案してください。

それまでは、それと一緒に暮らさなければならないかもしれません。最近のGrailsプロジェクトで似たようなことをすることは認めています。ライセンスチェックは既に大きなログインメソッドに意図的に組み込まれているため、チェックをバイパスするためにメソッドを置き換えるのはかなり困難です。


1
あなたがたぶん私と一緒に暮らさなければならないことは正しいでしょうが、私はそれがどれほど私を悩ませているかあなたに話すことができません。
ニール

2

彼はそのようなハッキングが実行可能であることを実証できますか、それとも彼がちょっと心配しているのは単なる仮説シナリオですか?彼はこの作業のライブデモを提供できますか?彼は試してみてください。真剣に。動作する場合は、管理者に提示し、難読化ツールを入手することを提案する必要があります。

難読化ツールのセキュリティが十分でない場合、JARをセキュリティで保護する他の方法(暗号化、ネイティブコードへのコンパイルなど)を検討しましたか?

RE:コードの修正:名前を変更するだけの問題ですか?多くのIDEには、これを非常に簡単に実行できるリファクタリングツールがあります。


彼は私を少し妄想的に打ちますが、その理由はわかります。製品がハッキングされた場合、おそらく彼の仕事を意味するでしょう。私はそれが可能だとは言いませんが、メソッド名を探す方法を知っているのは十分知っています。「isLicenseValid」と呼ばれる明白なメソッドがあれば、このメソッドを持ち、常にtrueを返すクラスを書くことです。それを「ハック」します。彼はそれを確認したいようですが、このプログラムはそれをさらに複雑にすることなく十分に複雑だと思います。はい、名前を変更することで彼のコードを簡単に修正できると思います。
ニール

「isLicenseValid」というメソッドがあるからといって、同じメソッドでクラスを書くだけでハッキングできるわけではありません。クラスを「封印済み」としてマークする場合(C#構文)、サードパーティはサブクラスを記述してメソッドをオーバーライドするだけでセキュリティチェックを回避することはできません。いずれにせよ、この男が会社のセキュリティ担当者でない限り、製品がハッキングされた場合に彼の仕事を意味するのはなぜですか?
タンディー

2
@Tundey、それはサブクラスの問題ではありません(どのようにロードされますか?):同じクラスを記述、ハッキングされたバージョンをクラスパス検索リストの前に置く問題です。
ピーターテイラー

1
ha。私はJavaでのクラスローディングの喜びを覚えています。それでも、それを軽減するためのより良い方法が必要です。実際、クラスローダーが危険にさらされていない場合、誰かがあなたのクラスと同じクラスを書くことができますか?特に、JARが署名されている場合は?JARに署名してクラスを封印すると、誰かがあなたと同じ名前のクラスを書く問題を解決できませんか?
タンディ

1
@Tundey Sun JVMは(ほとんど)オープンソースであり、変更できます。
Spudd86

2

IPがどれほど価値があるかに関係なく、ハッカーを混乱させることを期待してコードを破壊することは賢明なことではありません。前進を続けることは悪夢であるという事実は別として、それは実際には問題を解決しません。それは単に難しくしますが、不可能ではありません。したがって、それは実際には解決策ではなく、副作用は悪いです。それは効かない薬を服用しているようなもので、副作用があります。

あなたの問題は、IPを保護する方法です。そのためのソリューションを見つけてください:難読化ツール、ライセンスサーバーなど。


110%に同意します。IPの保護に関する懸念については、有効なポイントを挙げていますが、Webアプリケーションを実行するのは自分のマシンではなく、マシンであるため、これがクライアントの安全対策となります。私は、自分のマシンで当社の製品に直接アクセスし、それを分解できるクライアントにもっと関心がありました。ライセンスサーバーは、クライアント側のセキュリティと同じくらい優れています。ライセンスサーバーへのアクセスをバイパスできる場合は、本に記載されているトリックを使用しても、ライセンスなしでプログラムを使用できます。
ニール

1

別の開発者は、当社の暗号化/復号化ルーチンを命名するとき、私は同様の問題に遭遇したstr__copystr__delete(第2アンダースコアに注意してください)。それは不十分であり、もっとうまくやることができたので、ライセンスの更新が必要になるという話が出るまで待ちました。経営陣は、「ライセンスを取得するときにクリーンアップするので、時間がかからず、より安全になる」と説明したため、余分な数時間の問題はありませんでした。問題は解決しましたが、痛みはありません。


もちろん、後からいつでも変更できますが、変更はコードよりも頭にある必要があると思います。
ニール

1
@Neilそれでは、あなたが頭の変化を必要とする人であることをお勧めします。コードが機能し、適切なテストが行​​われ、使用する代わりにそのルートに進むと十分にコメントされている場合、難読化ツールは最良の選択ではありませんが、世界の終わりでもありません。問題がある場合は後で修正し、それ以外の場合は先に進みます。
クリストファービブス

@Christopher_Bibbs:安心してください。実際、最終的には問題が発生することをほぼ確実に保証できます。
ニール

1

最初に考えたのは、そのコードのメンテナンスです。コードがすでに難読化されており、彼が先に進んでいる場合は、そのコードを処理しようとして頑張ってください。その後、コードを解読しようとするハッカーになります。

代わりに、コードをクリーンアップし、難読化ツールを使用してすべてのハードワークを行うことをお勧めします。長期的には、多くの管理可能なコードがあり、ライセンスをハッキングしたい人にすべての複雑な複雑さを任せます。

完璧な難読化者はいないことを忘れないでください。また、非常に熱心なハッカーは何でもリバースエンジニアリングできますが、少なくとも彼だけです。さらに、難読化ツールは、ある人がおそらくできるよりもはるかに複雑さを増します。


0

私はあなたが上司に問題について尋ね、彼が言うことをするべきであるという答えに非常に同意します。

ただし、これらの回答に対する非常に重要な補遺は、セキュリティと保守性の両方に関する懸念を文書化することです。コードを変更するかどうかにかかわらず、人々があなたが心配していることとその理由を知ることが重要です。これは、積極的に(上司が行う必要があることさえ知らない上司に決定を下すことはできません)および防御的に(ハッカーがセキュリティが不十分なライセンスシステムに穴を開けた場合、彼らを責めることはできません)重要です間違い。)


0

「問題を知るための最も優れた専門家にならないでください」。

言い換えれば、あなたの上司に言って、そこから行きましょう。あなたが静かに保ち、あなたがその秘密のトトマポールのトップなら、プッシュが突き出るようになると、あなたは責任を負います。上司に合格を伝えて、上司にアプローチする方法を決めさせます。そうすれば、選択の負担から解放されます。

多くのマネージャーは技術的ではないかもしれないので、単に上司に話してはいけません。しかし、私たちはいつもやっていることをやってください。その後、彼らに決定させ、それを流した。マネージャー/リーダーが大金を支払われるのはそのためです!


0

明白な真実は、十分な時間とリソースがあれば、何でも解読できるということです。これは、アプリの人気度の単純な関数です。人気が高いほど、それが引き付けるスキルの高いハッカーであり、それを破るためにより多くの時間が費やされます。コードの難読化はまさにそれを提供します-暗号化と同様に、それを破るのに必要な時間を増やす手段。したがって、コードが難読化されている場合、攻撃者は熟練し、時間を割く必要があります。そうしないと、攻撃者は絶望してあきらめます。あなたのアプリが両端のトラブルに見合う価値があるかどうかを自問する必要があります。

実際、難読化されたコードをクラックするのがどれほど困難になるかは驚くべきことです。難読化により、簡単な10行のCプログラムを100行のアセンブリに簡単に変換できます。デバッグしようとすると、コードを無意味に飛び回ってしまい、ステップスルーするのが本当にイライラする可能性があります。最終的には壊れますが、それは本当に難しくなり、本当に不可能なことはないので、それがポイントです。コードの難読化は、それを破ることができる人の数を減らします。

もちろん、クラッカーではなくデバッガーを混乱させようとするなど、より良い方法がありますが、これは安価で効率的な方法です。しかし、不自然に名前を付けても、それは完全にはカットされません。コード全体に対して実際には何もしない制御フロー呼び出し関数を変更する必要がありますが、サイズと複雑さを増します。戻り値がどこでも使用されないダミー関数を、実際に何かを行う関数内から呼び出します。あなたはすでにこれがどのように本当に混乱するかを見ることができます。

攻撃者にはないものがあります。元のソースコード。自分で整理する方法を見つけてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.