diff_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package archive
  2. import (
  3. "testing"
  4. "github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
  5. )
  6. func TestApplyLayerInvalidFilenames(t *testing.T) {
  7. for i, headers := range [][]*tar.Header{
  8. {
  9. {
  10. Name: "../victim/dotdot",
  11. Typeflag: tar.TypeReg,
  12. Mode: 0644,
  13. },
  14. },
  15. {
  16. {
  17. // Note the leading slash
  18. Name: "/../victim/slash-dotdot",
  19. Typeflag: tar.TypeReg,
  20. Mode: 0644,
  21. },
  22. },
  23. } {
  24. if err := testBreakout("applylayer", "docker-TestApplyLayerInvalidFilenames", headers); err != nil {
  25. t.Fatalf("i=%d. %v", i, err)
  26. }
  27. }
  28. }
  29. func TestApplyLayerInvalidHardlink(t *testing.T) {
  30. for i, headers := range [][]*tar.Header{
  31. { // try reading victim/hello (../)
  32. {
  33. Name: "dotdot",
  34. Typeflag: tar.TypeLink,
  35. Linkname: "../victim/hello",
  36. Mode: 0644,
  37. },
  38. },
  39. { // try reading victim/hello (/../)
  40. {
  41. Name: "slash-dotdot",
  42. Typeflag: tar.TypeLink,
  43. // Note the leading slash
  44. Linkname: "/../victim/hello",
  45. Mode: 0644,
  46. },
  47. },
  48. { // try writing victim/file
  49. {
  50. Name: "loophole-victim",
  51. Typeflag: tar.TypeLink,
  52. Linkname: "../victim",
  53. Mode: 0755,
  54. },
  55. {
  56. Name: "loophole-victim/file",
  57. Typeflag: tar.TypeReg,
  58. Mode: 0644,
  59. },
  60. },
  61. { // try reading victim/hello (hardlink, symlink)
  62. {
  63. Name: "loophole-victim",
  64. Typeflag: tar.TypeLink,
  65. Linkname: "../victim",
  66. Mode: 0755,
  67. },
  68. {
  69. Name: "symlink",
  70. Typeflag: tar.TypeSymlink,
  71. Linkname: "loophole-victim/hello",
  72. Mode: 0644,
  73. },
  74. },
  75. { // Try reading victim/hello (hardlink, hardlink)
  76. {
  77. Name: "loophole-victim",
  78. Typeflag: tar.TypeLink,
  79. Linkname: "../victim",
  80. Mode: 0755,
  81. },
  82. {
  83. Name: "hardlink",
  84. Typeflag: tar.TypeLink,
  85. Linkname: "loophole-victim/hello",
  86. Mode: 0644,
  87. },
  88. },
  89. { // Try removing victim directory (hardlink)
  90. {
  91. Name: "loophole-victim",
  92. Typeflag: tar.TypeLink,
  93. Linkname: "../victim",
  94. Mode: 0755,
  95. },
  96. {
  97. Name: "loophole-victim",
  98. Typeflag: tar.TypeReg,
  99. Mode: 0644,
  100. },
  101. },
  102. } {
  103. if err := testBreakout("applylayer", "docker-TestApplyLayerInvalidHardlink", headers); err != nil {
  104. t.Fatalf("i=%d. %v", i, err)
  105. }
  106. }
  107. }
  108. func TestApplyLayerInvalidSymlink(t *testing.T) {
  109. for i, headers := range [][]*tar.Header{
  110. { // try reading victim/hello (../)
  111. {
  112. Name: "dotdot",
  113. Typeflag: tar.TypeSymlink,
  114. Linkname: "../victim/hello",
  115. Mode: 0644,
  116. },
  117. },
  118. { // try reading victim/hello (/../)
  119. {
  120. Name: "slash-dotdot",
  121. Typeflag: tar.TypeSymlink,
  122. // Note the leading slash
  123. Linkname: "/../victim/hello",
  124. Mode: 0644,
  125. },
  126. },
  127. { // try writing victim/file
  128. {
  129. Name: "loophole-victim",
  130. Typeflag: tar.TypeSymlink,
  131. Linkname: "../victim",
  132. Mode: 0755,
  133. },
  134. {
  135. Name: "loophole-victim/file",
  136. Typeflag: tar.TypeReg,
  137. Mode: 0644,
  138. },
  139. },
  140. { // try reading victim/hello (symlink, symlink)
  141. {
  142. Name: "loophole-victim",
  143. Typeflag: tar.TypeSymlink,
  144. Linkname: "../victim",
  145. Mode: 0755,
  146. },
  147. {
  148. Name: "symlink",
  149. Typeflag: tar.TypeSymlink,
  150. Linkname: "loophole-victim/hello",
  151. Mode: 0644,
  152. },
  153. },
  154. { // try reading victim/hello (symlink, hardlink)
  155. {
  156. Name: "loophole-victim",
  157. Typeflag: tar.TypeSymlink,
  158. Linkname: "../victim",
  159. Mode: 0755,
  160. },
  161. {
  162. Name: "hardlink",
  163. Typeflag: tar.TypeLink,
  164. Linkname: "loophole-victim/hello",
  165. Mode: 0644,
  166. },
  167. },
  168. { // try removing victim directory (symlink)
  169. {
  170. Name: "loophole-victim",
  171. Typeflag: tar.TypeSymlink,
  172. Linkname: "../victim",
  173. Mode: 0755,
  174. },
  175. {
  176. Name: "loophole-victim",
  177. Typeflag: tar.TypeReg,
  178. Mode: 0644,
  179. },
  180. },
  181. } {
  182. if err := testBreakout("applylayer", "docker-TestApplyLayerInvalidSymlink", headers); err != nil {
  183. t.Fatalf("i=%d. %v", i, err)
  184. }
  185. }
  186. }