Seminar Erkennung von Programmcode-Plagiaten - Semantic Scholar

[2] Collberg, Christian ; Thomborson, Clark ; Low, Douglas: A Taxonomy of ... [13] Metzger, Robert ; Wen, Zhaofang: Automatic Algorithm Recognition and Repla-.
230KB Größe 4 Downloads 330 Ansichten
Seminar „Erkennung von Programmcode-Plagiaten“ Prof. Dr. Erhard Plödereder

Torsten Görg

1 Organisatorisches Aktuelle Informationen finden Sie im Web: http://www.iste.uni-stuttgart.de/ps/lehre/ss2015/s-codeplagiate.html Vortrag: Eine frühzeitige Absprache mit dem Themenbetreuer ist notwendig (mindestens einen Monat vor dem Vortragstermin). Vortragsdauer von 30 Minuten mit anschließender Diskussion. Präsentationsfolien mindestens eine Woche vor dem Vorstellungstermin mit dem Betreuer besprechen. Ausarbeitung: Umfang: 7 – 9 Seiten einschließlich Zusammenfassung und Literaturverzeichnis im zweispaltigen IEEE-Format. Vorläufige Abgabe eine Woche vor dem Vortrag. Endgültige Abgabe zwei Wochen nach dem Vortrag (Nachbesserungen darüber hinaus sind nach Vereinbarung ggf. möglich). Stilvorlagen für LaTeX und Word stehen auf der Web-Seite zur Verfügung. Anwesenheit: Anwesenheit ist bei allen Veranstaltungen Pflicht. Krankheitsbedingtes Fehlen muss mit einem ärztlichen Attest entschuldigt werden. Benotung: Die Gesamtnote setzt sich aus Noten für den Vortrag, der Ausarbeitung und der Beteiligung am Seminar zusammen, wobei Vortrag und Ausarbeitung hohe Anteile besitzen. Zum Bestehen des Seminars müssen sowohl Vortrag als auch Ausarbeitung jeweils mit mindestens 4,0 bewertet werden. Plagiate in den Vortragsfolien oder in der Ausarbeitung führen zu der Gesamtnote 5,0.

1

2 Themen Rechtliche Aspekte von Programmcode-Plagiarismus Plagiarismus ist vor allem eine juristische Frage. Im Rahmen dieses Seminarvortrags soll dies für Programmcode-Plagiate betrachtet werden, die in den Bereich des sog. Softwarerechts fallen. Dabei ist zunächst zu klären, was Plagiarismus im Bezug auf Programmcode bedeutet. Das Urheberrecht schützt das geistige Eigentum von Autoren und somit auch die von Softwareentwicklern erstellten Programme. Damit Programme überhaupt von anderen Personen als den Autoren verwendet werden können, werden durch Softwarelizenzen Nutzungsrechte eingeräumt. Dabei gibt es eine große Bandbreite unterschiedlicher Lizenzmodelle, die von per Internet nutzbaren Diensten über kommerzielle Software bis hin zu Open-Source-Software reicht. Die Lizenz- und Nutzungsmodelle unterscheiden sich unter anderem darin, ob das eigentliche Programm für den Nutzer überhaupt nicht, in Form von Binärcode oder als Quelltext sichtbar ist. Entsprechend sind unterschiedliche Arten von Plagiaten möglich. Einige Lizenzmodelle erlauben aber explizit das Verändern der lizensierten Software oder sogar das Übernehmen von Code-Teilen zur Realisierung anderer Programme. Dabei ist die Frage zu beachten, in welcher Weise die veränderte oder mit übernommenen Code-Teilen neu erstellte Software verwendet werden und ob diese kommerziell vertrieben werden darf. Exemplarisch sollen die Eigenschaften und Besonderheiten einiger Lizenzmodelle dargestellt und verglichen werden [9], insbesondere der Lizenzmodelle MIT, BSD, GPL und LGPL. Literatur: [9], weitere nach Absprache Betreuer: Vortragstermin:

Torsten Görg Woche 18.05.–22.05.

Software-Patente Die Frage, ob es möglich sein soll, Software und Computerprogrammen zu Grunde liegende Verfahren und Algorithmen zu patentieren, ist in den vergangenen Jahren intensiv und kontrovers diskutiert worden. In diesem Seminarvortrag soll deutlich gemacht werden, was Software-Patentierung genau bedeutet und welche Konsequenzen ein solches Patent hat. Nach einer allgemeinen Betrachtung von Software-Patenten soll auf das Patent zu interprozeduralem Programm-Slicing [17] als konkretem Beispiel genauer eingegangen werden. An dem Patenttext dieses Beispiels wird deutlich, welche Informationen ein Patent umfasst und was durch das vorliegende Patent geregelt wird. Inhaltlich geht es in dem Beispielpatent um eine bestimmte Repräsentationsform von Programmen, die sog. Programmabhängigkeitsgraphen (PDGs), in der die semantischen Zusammenhänge innerhalb eines Programms explizit beschrieben sind. Auf Basis dieser Zwischendarstellung lässt sich z.B. sichtbar machen, welche Auswirkungen eine Codeänderung an einer bestimmten Stelle auf das restliche Programm hätte. Literature: [17], weitere nach Absprache

2

Betreuer: Vortragstermin:

Torsten Görg Woche 01.06.–05.06.

Plagiatserkennung mit Greedy-String-Tiling Der Greedy-String-Tiling-Algorithmus von Wise [20] identifiziert Teilsequenzen, die in zwei gegebenen Token-Strömen übereinstimmend vorhanden sind. Dazu werden zunächst die Quelltexte von zwei Programmen mittels einer lexikalischen Analyse in Token-Ströme übersetzt, um von lexikalischen Details der Quellen zu abstrahieren und durch das Zusammenfassen von Teilzeichenfolgen der Eingaben zu Tokens die Sequenzlängen zu reduzieren. Dann wird sukkzesive versucht, den einen Token-Strom mit übereinstimmenden Teilsequenzen des anderen Token-Stroms in Deckung zu bringen. Dabei wird mit den längsten Übereinstimmungen angefangen und mit immer kürzeren Übereinstimmungen fortgefahren, bis eine Minimallänge erreicht ist. Das Greedy-String-Tiling-Verfahren kommt in dem Plagiatserkennungswerkzeug JPlag von Prechelt, Malpohl und Phlippsen [16] zum Einsatz und wird von diesen Autoren intensiv evaluiert und durch einige Modifikationen verbessert. Insbesondere wird durch eine Kombination mit dem Hashing-Algorithmus von Karp und Rabin [6] die durchschnittliche Laufzeitkomplexität von quadratisch auf annährend linear reduziert. Literatur: [16, 6, 20] allgemeine Basis-Literatur: [11] Betreuer: Vortragstermin:

Torsten Görg Woche 08.06.–12.06.

Aufspüren von Plagiaten mit N-Gram-Fingerabdrücken Um bei einer Plagiatsprüfung nicht wiederholt alle einzelnen Zeichen oder Token des zu prüfenden Dokuments mit den Zeichen oder Token aller Referenzdokumente vergleichen zu müssen, ist die Idee naheliegend, die Dokumente auf Hashcodes abzubilden und nur diese Hashcodes zu vergleichen. Da man bei der Plagiatserkennung nicht nur vollständige, übereinstimmende Dokumente sondern auch plagiierte Textpassagen erkennen möchte, besteht eine Variante darin, jeweils nur kleine Stücke von N zusammenhängenden Zeichen zu betrachten; diese werden als N-Gramme bezeichnet. Es werden dann Hashwerte zu allen N-Grammen, die sog. Fingerabdrücke, aller Dokumente miteinander verglichen. Bei einer Plagiatsprüfung muss das zu prüfende Dokument in der Regel mit einer großen Menge von Referenzdokumenten verglichen werden. Daher ist die Performanz der Analyseverfahren sehr wichtig. Um die Performanz des obigen Ansatzes weiter zu steigern, hat Heintze [4] vorgeschlagen, die Betrachtung pro Dokument auf die k kleinsten Fingerabdrucks-Hashwerte zu beschränken. Manber [12] beschränkt die Analyse hingegen auf die Hashwerte, die ohne Rest durch einen fest vorgegebenen Modulo-Wert teilbar sind. Diese Beschränkungen haben den Nachteil, dass dadurch Plagiate ggf. übersehen werden. Schleimer, Wilkerson und Aiken [18] haben das Winnowing-Verfahren vorgestellt, das für große Datenmengen

3

gut skaliert und zugleich eine präzise Erkennung vieler Plagiate ermöglicht. Das Winnowing-Verfahren wurde in dem Plagiatserkennungswerkzeug MOSS umgesetzt und erprobt. Literatur: [18, 4, 12] allgemeine Basis-Literatur: [11] Betreuer: Vortragstermin:

Torsten Görg Woche 15.06.–19.06.

Verschleierung von Programmcode-Plagiaten Programmcode-Plagiate werden in der Regel mittels Copy&Paste in ein System eingebracht. Solange kopierte Codeteile dort unverändert vorzufinden sind, ist es vergleichsweise einfach, diese als Plagiate zu erkennen. Je stärker kopierter Code verändert wird, desto schwieriger wird es für Plagiatserkennungsverfahren, einen Zusammenhang zwischen diesem Code und der Originalquelle herzustellen. Ein funktionaler Grund für solche Veränderungen ist, dass der übernommene Code ggf. an die Umgebung, in die er hineinkopiert wurde, angepasst werden muss. Veränderungen des Codes können aber auch daraus resultieren, dass der Code bewusst semantikerhaltend transformiert wurde, um die Plagiierung zu verschleiern und die Wahrscheinlichkeit einer Entdeckung durch Plagiatserkennungswerkzeuge zu verringern. Im Rahmen dieses Seminarvortrags soll dargestellt werden, welche Möglichkeiten zur Modifikation von Programmcode bestehen, die die Programmsemantik nicht verändern. Die Palette reicht von Umbenennungen von Variablen über Vertauschungen von Anweisungen und Refaktorierung der Klassenhierarchie bis hin zum Ersetzen von Datenstrukturen und Algorithmenteilen [1]. Es gibt sogar zahlreiche Programme, sog. Code-Obfuskatoren, die eine Verschleierung von Programmcode automatisch durchführen. Einzelne solcher Code-Obfuskatoren und ihre Vorgehensweise sollen exemplarisch vorgestellt werden. Literatur: [1, 2, 13, 16] allgemeine Basis-Literatur: [11] Betreuer: Vortragstermin:

Torsten Görg Woche 22.06.–26.06.

Erkennung verschleierter Codeplagiate mittels Programmabhängigkeitsgraphen Ein Ansatz, bei der Programmcode-Plagiatserkennung etwaigen Verschleierungen von Plagiaten zu begegnen, besteht darin, die Codevergleiche auf die „semantische Essenz“ zu konzentrieren, die bei semantikerhaltenden Transformationen und somit auch bei bei Verschleierungen unverändert bleibt. Obwohl es grundsätzlich unmöglich ist, diese „semantische Essenz“ in reiner Form zu erfassen, kann man sich dem annähern, indem man von möglichst vielen semantisch irrelevanten Codedetails abstrahiert. Eine häufig verwendete Approximation sind Programmabhängigkeitsgraphen (PDGs). Diese beschreiben ein Programm ausschließlich durch Kontrollund Datenabhängigkeitskanten zwischen den Einzeloperationen, die als Graphknoten repräsentiert werden. Dies hat insbesondere den Vorteil, dass Verschiebungen

4

und Vertauschungen von unabhängigen Codeteilen sich nicht in Veränderungen der Graphdarstellung niederschlagen. Auf Grund dieses Vorteils werden PDGs auch zur Codeklonerkennung eingesetzt [7, 8]. Da PDGs Graphen sind, führen Vergleiche von PDGs allerdings zum NPvollständigen Teilgraph-Isomorphismus-Problem. Daher vergleichen die PDG-basierten Klonerkennungsverfahren die PDGs nur approximierend. Im Plagiatserkennungswerkzeug GPlag von Liu, Chen, Han und Yu [10] wird der PDG-Ansatz zum Erkennnen von Codeplagiaten aufgegriffen und experimentell evaluiert. Zur weiteren Performanzsteigerung enthält GPlag Filter, die den Suchraum reduzieren, bevor die eigentlichen Vergleiche durchgeführt werden. Literatur: [10, 7, 8] allgemeine Basis-Literatur: [11] Betreuer: Vortragstermin:

Torsten Görg Woche 29.06.–03.07.

Konzeptgraphen-basierter Ähnlichkeitsvergleich von Programmcode Viele Verfahren zum Erkennen und Aufspüren von Programmcode-Ähnlichkeiten wählen entweder einen Ansatz, der nur auf Vergleichen von Struktureigenschaften basiert, die mit Compilerbau-Technologien aus dem Programmcode heraus abstrahiert werden (Tokenströme, Syntaxbäume, Kontrollflussgraphen, etc.), oder einen Ansatz auf Basis von Technologien der Computer-Linguistik, bei dem Hinweise auf die Semantik des Codes aus den unstrukturierten Textbestandteilen von Programmen gewonnen werden (Identifier-Namen, Kommentare im Code und/oder Sekundärdokumente zur Programmbeschreibung). Wenn man eine Analyse auf eine dieser beiden Aspekte beschränkt, schöpft man den Informationsgehalt des gegebenen Programcodes nicht völlig aus. Daher ist es naheliegend zu versuchen, beides miteinander zu verbinden. Eine Möglichkeit dazu besteht in der Verwendung von Konzeptgraphen [19]. In einem von Mishne und Rijke [14] vorgeschlagenen Verfahren wird Programmcode in eine Darstellung durch Konzeptgraphen überführt, um anschließend Ähnlichkeitsvergleiche auf den Konzeptgraphen durchzuführen. In den Konzeptgraphen ist dabei sowohl Strukturinformation erfasst, nämlich durch die Graphstruktur der Konzeptgraphen, als auch linguistisch relevante Information in Form von textuellen Annotationen der Graphknoten. Zum Vergleich der Konzeptgraphen wird dann quantitativ eine Ähnlichkeitsmetrik auf Basis von Ähnlichkeitsfunktionen und Gewichtungen berechnet. Literatur: [14, 19] allgemeine Basis-Literatur: [11] Betreuer: Vortragstermin:

Torsten Görg Woche 06.07.–10.07.

Codeplagiats-Erkennung mit dynamischen Programmanalysen Neben statischen gibt es auch dynamische Programmanalysen, die sich dadurch auszeichnen, dass sie ein zu untersuchendes Programm zur Ausführung bringen,

5

um während der Ausführung Informationen über das Programm zu gewinnen. Dynamische Programmanalysen können auch zum Erkennen von Codeklonen eingesetzt werden und damit ggf. auch zum Aufspüren von Programmcode-Plagiaten. Verwandt zu diesem Problem ist das Softwarekomponenten-Retrieval, bei dem es darum geht, zu einer gegebenen Spezifikation einer Komponente bereits existierende Implementierungen dieser Funktionalität zu finden. Podgurski und Pierce [15] schlagen ein Verfahren vor, dass zunächst eine Menge von zu der Spezifikation passenden Testeingaben und die zugehörigen, gewünschten Ausgaben generiert und dann mit diesen Testdatensätzen die bereits verfügbaren Komponenten testet. Liefert eine Komponente für die Testeingaben genau die Ausgabe, die entsprechend der Komponentenspezifikation gefordert sind, ist es wahrscheinlich, dass diese Komponente die Spezifikation erfüllt. Zur Plagiatserkennung könnten für eine zu überprüfende Komponente Testdatensätze generiert und in gleicher Weise auf eine Menge von Referenzkomponenten angewendet werden. Dieser dynamische Ansatz zur Plagiatserkennung eignet sich besonders für stark verschleierte Plagiate. Das Vorgehen bei der dynamischen Codeklonerkennung ist ähnlich [5, 3]. Allerdings wird hier nicht nur eine Komponente bzw. Komponentenspezifikation betrachtet sondern nach allen funktionalen Übereinstimmungen innerhalb einer gegebenen Menge von Progammcodestücken (z.B. der Menge aller Methoden) gesucht. Dazu werden die Codestücke an Hand ihrer Signaturen in Cluster gruppiert und jeweils das Verhalten aller in dasselbe Cluster einsortierten Codestücke miteinander verglichen. Literatur: [15, 5, 3] allgemeine Basis-Literatur: [11] Betreuer: Vortragstermin:

Torsten Görg Woche 13.07.–17.07.

Literatur [1] Balakrishnan, Arini ; Schulze, Chloe: Code Obfuscation Literature Survey. 2005 [2] Collberg, Christian ; Thomborson, Clark ; Low, Douglas: A Taxonomy of Obfuscating Transformations. 1997 [3] Deissenboeck, Florian ; Heinemann, Lars ; Hummel, Benjamin: Challenges of the Dynamic Detection of Functionally Similar Code Fragments. In: Proceedings of the 16th European Conference on Software Maintenance and Reengineering, IEEE, 2012 (CSMR 2012), S. 299–308 [4] Heintze, Nevin: Scalable document fingerprinting. In: 1996 USENIX Workshop on Electronic Commerce, 1996 [5] Jiang, Lingxiao ; Su, Zhendong: Automatic mining of functionally equivalent code fragments via random testing. In: Proceedings of the 18th International Symposium

6

on Software Testing and Analysis. New York, NY, USA : ACM, 2009 (ISTTA 2009). – ISBN 978–1–60558–338–9, S. 81–91 [6]

Karp, R. M. ; O., Rabin M.: Efficient randomized pattern-matching algorithms. In: IBM Journal of Research and Development 13 (1987), März, Nr. 1, S. 249–260

[7]

Komondoor, Raghavan ; Horwitz, Susan: Using Slicing to Identify Duplication in Source Code. In: Proceedings of the 8th International Symposium on Static Analysis. London, UK, UK : Springer-Verlag, 2001 (SAS ’01). – ISBN 3–540–42314–1, 40–56

[8]

Krinke, Jens: Identifying Similar Code with Program Dependence Graphs. In: Proceedings of the Eighth Working Conference on Reverse Engineering (WCRE’01). Washington, DC, USA : IEEE Computer Society, 2001 (WCRE ’01). – ISBN 0– 7695–1303–4, 301–

[9]

Laurent, Andrew M. S.: Understanding Open Source and Free Software Licensing. O’Reilly Media, 2004. – ISBN 978–0–596–00581–8

[10] Liu, Chao ; Chen, Chen ; Han, Jiawei ; Yu, Philip S.: GPLAG: Detection of Software Plagiarism by Program Dependence Graph Analysis. In: Proceedings of the 12th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. New York, NY, USA : ACM, 2006 (KDD ’06). – ISBN 1–59593–339–5, 872–881 [11] Loose, Fabian ; Becker, Steffen ; Potthast, Martin ; Stein, Benno: RetrievalTechnologien für die Plagiatserkennung in Programmen. In: Proceedings of the LWA 2008. Technical Report 448, University of Würzburg, 2008, S. 5–12 [12] Manber, Udi: Finding similar files in a large file system. In: Proceedings of the USENIX Winter 1994 Technical Conference. San Francisco, CA, USA, 1994, S. 1–10 [13] Metzger, Robert ; Wen, Zhaofang: Automatic Algorithm Recognition and Replacement. Cambridge MA 02142-1209 : The MIT Press, 2000. – ISBN 9780262133685 [14] Mishne, Gilad ; Rijke, Maarten D.: Source Code Retrieval using Conceptual Similarity. In: Proceedings of the 2004 Confonference on Computer Assisted Information Retrieval (RIAO ’04), 2004, S. 539–554 [15] Podgurski, Andy ; Pierce, Lynn: Retrieving Reusable Software by Sampling Behavior. In: ACM Transactions on Software Engineering and Methodology (TOSEM) 2 (1993), Juli, Nr. 3, 286–303. http://dx.doi.org/10.1145/152388.152392. – DOI 10.1145/152388.152392. – ISSN 1049–331X [16] Prechelt, Lutz ; Malpohl, Guido ; Phlippsen, Michael: JPlag: Finding plagiarism among a set of programs. In: Technical Report 2000-1 (2000), März

7

[17] Reps, T. ; Horwitz, S. ; Binkley, D.: Interprocedural slicing of computer programs using dependence graphs. http://www.google.co.in/patents/US5161216. Version: November 3 1992. – US Patent 5,161,216 [18] Schleimer, Saul ; Wilkerson, Daniel S. ; Aiken, Alex: Winnowing: Local Algorithms for Document Fingerprinting. In: Proceedings of the 2003 ACM SIGMOD international conference on Management of data. New York, NY, USA : ACM, June 9-12 2003 (SIGMOD ’03), S. 76–85 [19] Sowa, J. F.: Conceptual Structures: Information Processing in Mind and Machine. Boston, MA, USA : Addison-Wesley Longman Publishing Co., Inc., 1984. – ISBN 0–201–14472–7 [20] Wise, Michael J.: String similarity via greedy string tiling and Karp-Rabin matching. (1993), Dezember. www.pam1.bcs.uwa.edu.au/~michaelw/ftp/doc/RKR_ GST.ps

8